Java - переупорядочение внутри синхронизированного блока - PullRequest
1 голос
/ 07 июля 2011

Возможно ли переупорядочение операторов внутри синхронизированного блока?Например,

synchronized(lock) {
   statement1;
   statement2;
}

, в котором оператор1 и оператор2 не зависят друг от друга.Может ли процессор или компилятор изменить порядок этих утверждений?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 07 июля 2011

Да, эти операторы могут быть переупорядочены в блоке synchronized, если это решит оптимизатор.Но их нельзя извлечь из synchronized.

1 голос
/ 07 июля 2011

Компилятор (на самом деле оптимизатор) может изменить порядок вещей или даже исключить код (например, присвоение переменной, на которую не будут ссылаться ссылки до выхода из области видимости), если он знает наверняка, что побочных эффектов не будет и это ускорит процесс. Это произойдет только внутри самого синхронизированного блока.

0 голосов
/ 27 июля 2012

Согласно JSR-133, операторы внутри синхронизированного блока не могут быть переупорядочены: http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html, Раздел "Что делает синхронизация"

"Каждое действие в потоке происходит перед каждым действием в этомпоток, который идет позже в порядке программы. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...