메서드 앞에 '동기화' 키워드를 사용하면 해당 객체가 동기화된다는 것을 알고 있습니다. 즉, 객체의 동일한 인스턴스를 실행하는 두 개의 스레드가 동기화됩니다.
그러나 동기화는 객체 수준에서 이루어지기 때문에 객체의 다른 인스턴스를 실행하는 2개의 스레드는 동기화되지 않습니다. Java 클래스에 메서드에 의해 호출되는 정적 변수가 있는 경우 클래스의 인스턴스 간에 동기화되기를 원합니다. 두 인스턴스가 서로 다른 2개의 스레드에서 실행되고 있습니다.
다음과 같은 방법으로 동기화를 달성할 수 있을까요?
public class Test
{
private static int count = 0;
private static final Object lock= new Object();
public synchronized void foo()
{
synchronized(lock)
{
count++;
}
}
}
정적인 객체 lock
을 정의하고 해당 잠금에 synchronized
키워드를 사용하고 있으므로 이제 정적 변수 count
가 Test
클래스의 인스턴스 간에 동기화되는 것이 맞나요?
정적 변수에 대한 액세스를 동기화하는 방법에는 여러 가지가 있습니다.
동기화된 정적 메서드를 사용합니다. 이는 클래스 객체에서 동기화됩니다.
public class Test {
private static int count = 0;
공용 정적 동기화 void incrementCount() {
count++;
}
}
클래스 객체에서 명시적으로 동기화합니다.
public class Test {
공용 정적 int count = 0;
public void incrementCount() {
동기화 (Test.class) {
count++;
}
}
}
다른 정적 객체에서 동기화합니다.
public class Test {
private static int count = 0;
비공개 정적 최종 객체 countLock = 새로운 객체();
public void incrementCount() {
동기화 (countLock) {
count++;
}
}
}
잠금 객체가 클래스 외부에 노출되지 않기 때문에 대부분의 경우 방법 3이 가장 좋습니다.