Java에서 클래스의 다른 인스턴스를 실행하는 스레드 간에 정적 변수를 동기화하려면 어떻게 해야 합니까?
이 명령어를 사용하여synchronize
키워드를 지정합니다.즉, 개체의 동일한 인스턴스를 실행하는 2개의 스레드가 동기화됩니다.
그러나 동기화가 개체 수준이기 때문에 개체의 서로 다른 인스턴스를 실행하는 2개의 스레드는 동기화되지 않습니다.Java 클래스에 메서드에 의해 호출되는 정적 변수가 있는 경우 클래스의 인스턴스 간에 동기화해야 합니다.2개의 인스턴스가 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; public static synchronized void incrementCount() { count++; } }
클래스 개체에서 명시적으로 동기화합니다.
public class Test { private static int count = 0; public void incrementCount() { synchronized (Test.class) { count++; } } }
다른 정적 개체로 동기화합니다.
public class Test { private static int count = 0; private static final Object countLock = new Object(); public void incrementCount() { synchronized (countLock) { count++; } } }
방법 3은 잠금 개체가 클래스 외부에 노출되지 않기 때문에 대부분의 경우에 가장 좋습니다.
단순히 카운터를 공유하는 경우 automicInteger 또는 java.util.concurrent.atomic 패키지의 다른 적절한 클래스를 사용하는 것을 고려합니다.
public class Test {
private final static AtomicInteger count = new AtomicInteger(0);
public void foo() {
count.incrementAndGet();
}
}
네, 사실입니다.
클래스의 인스턴스를 두 개 만드는 경우
Test t1 = new Test();
Test t2 = new Test();
다음으로 t1.foo와 t2.foo는 모두 같은 스태틱오브젝트에서 동기화되기 때문에 서로 차단됩니다.
ReentrantLock을 사용하여 정적 변수 동기화를 수행할 수도 있습니다.
public class Test {
private static int count = 0;
private static final ReentrantLock reentrantLock = new ReentrantLock();
public void foo() {
reentrantLock.lock();
count = count + 1;
reentrantLock.unlock();
}
}
클래스 전체에서 코드를 동기화할 수 있습니다.그게 가장 간단할 거야.
public class Test
{
private static int count = 0;
private static final Object lock= new Object();
public synchronized void foo()
{
synchronized(Test.class)
{
count++;
}
}
}
이 답변이 유용하기를 바랍니다.
언급URL : https://stackoverflow.com/questions/2120248/how-to-synchronize-a-static-variable-among-threads-running-different-instances-o
'programing' 카테고리의 다른 글
위도/경도에 따라 두 점 사이의 거리를 구합니다. (0) | 2022.09.19 |
---|---|
케이스를 올바르게 사용하는 방법..MySQL의 경우 (0) | 2022.09.19 |
오브젝트의 모든 속성을 인쇄하는 방법 (0) | 2022.09.19 |
로짓이 뭐죠?softmax와 softmax_cross_entropy_with_logits의 차이점은 무엇입니까? (0) | 2022.09.19 |
toString()과 hashCode()가 오버라이드 되었을 때 자바에서 객체의 "객체 참조"를 얻으려면 어떻게 해야 합니까? (0) | 2022.09.19 |