상태가 여러 필드로 구성된 공유 객체에 대한 스레드 간 액세스를 동기화해야합니다. 말 :여러 필드 : volatile 또는 AtomicReference?
이//writer
shared.setA("state");
shared.setB(1);
이제 내 질문하는 방법입니다
class Shared{
String a; Integer b;
//constructor, getters and setters
....
}
나는 특정 지점에서 쓸 것이다
//readers
shared.getA();
shared.getB();
단 하나의 스레드를하고,이 객체 읽기 가능한 많은 스레드를 읽기 스레드가 일관성없는 상태에서 공유 객체를 찾지 않도록합니다.
스레드 간의 일관성을 위해 volatile
이 해결책이라고 많은 답변을 읽었지만 여러 필드에서 어떻게 작동하는지 모르겠습니다. 예, 충분하니?
volatile String a; volatile Integer b;
또 다른 해결책은 AtomicReference, 예를 공유 객체는 불변하고 사용하는 것,
AtomicReference<Shared> shared = ....
및
다음 작가가 참조를 교환 단지 의지 :Shared prev = shared.get();
Shared newValue = new Shared("state",1);
while (!shared.compareAndSet(prev, newValue))
는 방법입니다 옳은? 감사! 내 설정 공유 객체에서
업데이트는 ConcurrentHashMap<Id,Shared>
에서 검색, 그래서 코멘트 동의 불변의 접근 방식을 사용하거나 이동 또는 모두 함께 공유에 업데이트를 동기화를 통해하는 방법. 그러나 완벽을 기하기 위해 ConcurrentHashMap<Id,AtomicReference<Shared>>
위의 솔루션이 실행 가능하거나 잘못되었거나 불필요한 것인지 여부를 확인하는 것이 좋습니다. 누구든지 설명 할 수 있습니까? 감사!
class Shared{
private final String a;
private final int b;
//constructor, getters and NO setters
}
을 그리고 당신은 안전하게 휘발성 사용할 수있는 단 하나 명의 작가가 있다면, AtomicRefference의 필요가 없습니다 : 모든
a와 b 모두에 원자 적으로 작성해야하는 경우 솔루션은 실제로 변경 불가능한 접근 방식을 사용합니다. AtomicReference는 필요하지 않습니다. 현재 공유 인스턴스에 간단한 휘발성 필드입니다. – Voo
'Shared' 클래스를 불변으로 만들고 하나의 쓰레드 만 쓰면 atomic compareAndSet이 필요 없으며 단지'volatile Shared shared;'가 작업을 수행합니다. –
[ReadWriteLock] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReadWriteLock.html) 사용은 어떻게됩니까? – Fildor