두 개의 동시 스레드에 의해 많이 액세스되는 두 개의 동기화 된 블록이 있습니다. 경합과 컨텍스트 전환을 줄이고 싶습니다. AtomicBoolean
에서 CAS (CompareAndSet) 연산을 사용하여이를 수행 할 수 있습니까?CAS 작업을 사용하여 Java에서 동기화 된 블록을 작성하는 다른 방법이 있습니까?
예 : 내가 그 차이가 생각하지 않는 한 java.util.concurrent.locks.Lock
클래스를 사용하지 않으
private final Object lock = new Object();
// Thread A executing this
public final void methodA() {
synchronized(lock) {
...
}
}
// Thread B executing this
public final void methodB() {
synchronized(lock) {
...
}
}
. CAS를 사용하고 싶습니다.
private final AtomicBoolean flag = new AtomicBoolean();
while (!flag.compareAndSet(false, true));
try {
//your code here
} finally {
flag.set(false);
}
당신은 모두 당신의 경쟁 시나리오에서 실제로 성능을 향상 않습니다 있는지 확인하기 위해 테스트해야합니다 :
실제 병목 현상이 발생했는지 (예 : 프로파일 링을 통해) 추측 했습니까? – NPE
예 병목 현상입니다. 그것이 아니더라도 CAS를 통해 대안이 있는지 이해하고 싶습니다. 감사! –
Richard - 동기화 된 블록 내에서 어떤 종류의 코드가 수행됩니까? 불리언에 대한 간단한 조작? –