Re[7]: Brian Goetz и др. Java Concurrency in Practice
От: Sergey.Zakharov  
Дата: 14.08.06 15:36
Оценка:
Здравствуйте, Sergey.Zakharov, Вы писали:

SZ>Здравствуйте, bolshik, Вы писали:


B>>Здравствуйте, mik1, Вы писали:


M>>>Посмотрите внимательно на то, как поля инициализированы в конструкторе, и на то, в каком порядке их устанавливает setter. Речь идет именно о переупорядочивании операций.

B>>правильно ли я понимаю, что ты имеешь ввиду, что когда в setter() сначала инициализируется int, потом boolean, авторы считают, что этот порядок противоположен? С моей точки зрения там беда в том, что поля объявлены без модификатора volatile.

SZ>На этом примере автор хотел показать что — "There is no guarantee that operations in one thread will be performed in the order given by the program." Это называется 'reordering'.

SZ>Присваивание boolean переменной могло происходить раньше чем int (например из-за оптимизации компилятором). И другой поток мог увидеть boolean раньше и получить неверное значение int.
SZ>По спецификации JVM (а точнее её части Java Memory Model) volatile не помогала в таких случаях до версии JVM 5.0, ещё в версии 1.4 volatile переменные могли реордерится (http://www-128.ibm.com/developerworks/java/library/j-jtp02244.html — Problem 2) хотя для 1.4 вышла заплатка в виде багфикса, которая меняла это поведение и запрещала реордеринг volatile переменных.

Сорри, поторопился слегка На самом деле предыдущие виртуальные машины могли реордерить volatile и non-volatile (т.е. если int не volatile, а bool — volatile, тогда код не работает). Две volatile переменные запрещалось реордерить и раньше. В новых VM (5.0), грубо говоря, запрещен также реордеринг volatile и non-volatile переменных. Т.е. после до присваивания чего-либо volatile переменной компилятор обязан сделать все присвоения non-volatile переменных
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.