말 그대로 락 구역을 줄이는 방법. syncronized 범위를 줄이는 등. 또는 락 점유 시간을 단축
각 상태변수의 락을 하나로 잡는 것이 아니라 분할하여 잡는 방법. 락의 정밀도를 높힘
public class ServerStatusBeforeSplit {
@GuardedBy("this") public final Set<String> users;
@GuardedBy("this") public final Set<String> queries;
public ServerStatusBeforeSplit() {
users = new HashSet<String>();
queries = new HashSet<String>();
}
// syncronized 로 인해 this에 락이 잡히게 되고
// user 와 queries 는 서로 독립적인 변수임에도 같은 락이 잡힘
public synchronized void addUser(String u) { users.add(u); }
public synchronized void addQuery(String q) { queries.add(q); }
public synchronized void removeUser(String u) { users.remove(u);}
public synchronized void removeQuery(String q) { queries.remove(q); }
}
위의 코드를 아래와 같이 개선가능. (락은 더 작은 범위, 더 정밀한 범위로 쪼갬)
public class ServerStatusAfterSplit {
@GuardedBy("users") public final Set<String> users;
@GuardedBy("queries") public final Set<String> queries;
public ServerStatusAfterSplit() {
users = new HashSet<String>();
queries = new HashSet<String>();
}
public void addUser(String u) {
synchronized (users) {
users.add(u);
}
}
public void addQuery(String q) {
synchronized (queries) {
queries.add(q);
}
}
public void removeUser(String u) {
synchronized (users) {
users.remove(u);
}
}
public void removeQuery(String q) {
synchronized (users) {
queries.remove(q);
}
}
}
독립적인 객체를 여러가지 단위로 묶어내고, 묶은 블록을 단위로 락을 나누는 방법. 예를 들면 리스트를 N개로 쪼개고, 해당 하는 부분에만 락을 거는 방법
