Re[10]: volatile
От: Golovach Ivan Украина http://kharkovitcourses.blogspot.com
Дата: 02.10.09 20:44
Оценка:
Здравствуйте, remark, Вы писали:
R>Ещё раз — с т.з. программиста Java volatile обеспечивают последовательную консистентность и не допускают никаких переупорядочиваний. Это то, чем надо руководствоваться; всё остальное — детали реализации.

МММ ... Я еще раз пересмотрел 17-ю главу jls.third_edition [http://java.sun.com/docs/books/jls/third_edition/html/memory.html] и не обнаружил правила запрещающего следующее:
Пусть один поток вызывает метод doIt() у общего объекта
class Shared {
    public volatile int vol = 0;
    public int nonvol = 0;
    public void doIt() {
        vol = 1;
        nonvol = 1;
    }
}

а второй поток проверяет условие у этого же общего объекта
Shared shared = ... 
if (shared.vol == 0 && shared.nonvol == 1) {...}

и, как я понимаю, это условие МОЖЕТ ВЫПОЛНИТСЯ. Т.е. с точки зрения второго потока будет виден реордеринг записи vol и записи nonvol.
Для себя я понял JMM так, что нельзя нарушать happend-before и casuality. Оно и не нарушается в данном примере.
Вполне допускаю, что я не прав. Но тогда я заблуждаюсь искренне.
Вы могли бы обосновать свое мнения на моем примере основываясь на спецификации языка?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.