나는 실제로 동시성을 읽고 있는데 오해가있다.
인용 : DCL에 진짜 문제가 동기화없이 공유 객체 참조를 읽는 것은 잘못 오래된 값을 볼 때 최악의 일이 이 일어날 수 있다는 가정이다Double-Check-Locking은 객체 상태를 보장합니까? (실제 동시성)
(이 경우, 널 (null)) ; 이 경우 DCL 관용구가 자물쇠가 잠겨있는 상태에서 을 다시 시도하여이 위험을 보완합니다. 그러나 최악의 경우는 실제로 상당히 입니다. 참조의 현재 값을 볼 수는 있지만 개체의 상태는으로 부실 값입니다. 이는 개체가 이 잘못된 상태이거나 잘못된 상태 인 것으로 나타 났음을 의미합니다.
브라이언 게츠는 DCL은 현재 메모리 모델은 휘발성 사용하여 작동합니다 기록 후 :
public class DoubleCheckLociing{
private static volatile Resource resource;
public static Resource getInstance(){
if(resource == null){
synchronized(DoubleCheckLociing.class){
if(resource == null){
resource = new Resource();
}
}
}
return resource;
}
}
내가 올바른 상태에 대한 문구를 이해한다면 확실하지 않다.
class Resource{
private Date date = new Date();//mutable thread unsafe class
private int k = 10;
public Date getDate(){
return date;
}
public int getK(){
return k;
}
}
내가 getInstance
항상 항상 올바른 반환 correct
자원을 반환 할 것을 보증한다이 있습니까 k
(10)와 date
:
는 Resource
클래스는 다음과 같습니다 상상할 수 있습니다?
* 항상 올바른 k (10) 및 date? *를 반환하는 올바른 리소스를 getInstance가 반환한다는 보장이 있습니까? 따라서 Brian Goetz *가 맞는지 여부를 확인하기 만하면됩니까? – CKing
제 이해가 정확한지 확인해야합니다. 나의 이전의 이해는 완전히 다른 것이었다. 나는 공유 참조의 2 읽기 문제를 생각. 첫 번째는 반환 할 수 있습니다! = nul하지만 두 번째는 null 일 수 있습니다 – gstackoverflow
그리고 이것을 확인한 사이트에서 단 하나의 답을 찾지 못했습니까? – CKing