이것은 java에서 공유 객체를 동기화하는 올바른 방법에 관한 질문입니다. 한 가지주의 할 점은 공유하려는 개체에 정적 메서드에서 액세스해야한다는 것입니다. 내 질문은, 정적 필드에 동기화하는 경우 동기화 된 정적 메서드와 비슷한 방식으로 필드가 속한 클래스를 잠급니까? 아니면 필드 자체 만 잠글 것입니까?Java에서 공유 된 정적 객체를 동기화하는 올바른 방법은 무엇입니까?
필자의 구체적인 예에서는 PayloadService.getPayload() 또는 PayloadService.setPayload()를 호출하면 PayloadService.payload가 잠길 것인가? 아니면 전체 PayloadService 클래스를 잠글 것인가?
이 방법이 올바른지/수용 가능한 방법입니까?
예를 들어, PayloadService는 별도의 스레드이며 일정한 간격으로 페이로드 개체를 업데이트합니다. 다른 스레드는 PayloadService.getPayload()를 임의의 간격으로 호출하여 최신 데이터를 가져와야합니다.
public class PayloadHolder {
private static PayloadHolder holder;
private static PayloadDTO payload;
private PayloadHolder(){
}
public static synchronized PayloadHolder getInstance(){
if(holder == null){
holder = new PayloadHolder();
}
return holder;
}
public static synchronized void initPayload(){
PayloadHolder.payload = new PayloadDTO();
}
public static synchronized PayloadDTO getPayload() {
return payload;
}
public static synchronized void setPayload(PayloadDTO p) {
PayloadHolder.payload = p;
}
}
public class PayloadService extends Service {
private static PayloadHolder payloadHolder = PayloadHolder.getInstance();
public static void initPayload(){
PayloadHolder.initPayload();
}
public static void setPayload(PayloadDTO payload){
PayloadHolder.setPayload(payload);
}
public static PayloadDTO getPayload() {
return PayloadHolder.getPayload();
}
...
합법적이 방법이다 : t는 응답을 바탕으로 자사의 타이머 작업
을 수행에서 PayloadService을 잠 그려면, 나는 다음에 리팩토링? 나는 이런 식으로하거나 Hardcoded에 언급 된 AtomicReference 접근법을 사용하는 것이 더 나은지 궁금하다. - PayloadService가 실행되는 동안에 만 jvm에서 PayloadHolder 클래스에 대한 참조를 유지하기 위해 PayloadService에 PayloadHolder의 인스턴스를 유지하고 있습니다.
제안 된 AtomicReference 구현이 원래 질문에 게시 한 리팩터링 된 예제와 비교하여 더 나은 성능을 선호합니까? – JohnRock
하나의 변수 만 설정할 경우 volatile/AtomicReference를 사용하는 것이 좋습니다. 자물쇠가 없으므로 스케일링이 훨씬 좋습니다. Volatile 및 AtomicReference는 원자 CPU 명령을 사용하여 구현되므로 전체 동기화 (레지스터 플러시 및 업데이트, 잠금 획득)에 대한 오버 헤드가 없습니다. – Hardcoded
제안 해 주셔서 감사합니다. 귀하의 메서드 getInstance()에 혼란 스러워요. check (holder == null)을 확인하기 전에 holder.get()을 호출합니다. 그게 의도적 인거야? 그게 NPE를 생산할 수 있습니까? – JohnRock