Я читаю параллелизм на практике и имею некоторое недоразумение.
цитата:Двойная проверка-блокировка гарантирует состояние объекта? (параллелизм на практике)
реальная проблема с DCL является предположение о том, что самое худшее, что может произойти при чтении ссылку на общий объект без синхронизации является ошибочно видеть несвежий значение (в данном случае, нуль) ; в этом cse идиома 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;
}
}
Я не уверен, если понимать фразу о состоянии правильной.
Давайте представим, что 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
?
* Есть ли у меня гарантии, что getInstance всегда возвращает правильный ресурс, который всегда возвращает правильные k (10) и дату? *. Поэтому вам просто нужно подтвердить, правильно ли Брайан Гетц *? – CKing
Мне нужно подтверждение, что мое понимание правильное. Мое прежнее понимание было совсем другим. Я думал, что проблема с 2 чтениями общей ссылки. Первый может вернуться! = Nul, но второй может быть пустым – gstackoverflow
И вы не нашли ни одного ответа на сайте, который подтвердил это? – CKing