나는 제어 할 수없는 두 가지 동기화 된 메서드가있는 클래스를 사용하는 병렬로 많은 스레드가 액세스하는 메서드가 있습니다. getObject 및 createNewObject. 나는 여러 객체 (MyObject)를 생성하지 않도록하고 싶다. 스레드가 너무 다른 스레드에서 올 수뿐만 아니라 객체를 생성 얻고 만드는 방법 사이 일시 중지 될 수 있기던져 예외 vs 동기화
MyObject obj;
public void method1() {
obj = getObject("key");
if (obj == null)
obj = createNewObject("key");
}
이, 내가 생각 작동하지 않을 것입니다. 동기 된 createNewObject 메쏘드는 객체가 "key"라는 이름으로 이미 존재하는지 검사하고, 그 경우에 예외를 throw함으로써 이것을 수정합니다.
다음 중 어떤 방법을 선호합니까? 성능, 안전성 및 디자인이 현명합니다. 이중 잠금 유형 (방법 3)이 작동하지 않는다고 들었습니다. 어쩌면 나는 방법 1을 사용해야 만 할까?
대부분의 경우 개체가 발견되어 아무런 문제가 없습니다. 드물게 동기화를 건너 뛰고 예외를 처리하는 것이 더 나은 성능 일 수 있습니까?
MyObject obj;
public synchronized void method1() {
obj = getObject("key");
if (obj == null)
obj = createNewObject("key");
}
public void method2() {
obj = getObject("key");
if (obj == null)
try {
obj = createNewObject("key");
} catch (Exception e) { // ops, someone already created object "key"
obj = getObject();
}
}
public void method3() {
obj = getObject("key");
if (obj == null)
obj = getObj("key");
}
public synchronized MyObject getObj(String key) {
MyObject obj = getObject(key);
if (obj == null)
obj = createNewObject(key);
return obj;
}
method3이 작동하지 않는 이유에 대한 자세한 내용은 http://www.ibm.com/developerworks/java/library/j-dcl.html을 확인하십시오. – gabuzo