Модель java meomry требует, чтобы блоки synchronize
, которые синхронизируются на одном и том же мониторе, обеспечивали преобразование переменных, измененных внутри этих блоков, до и после реализации. Пример:
// in thread A
synchronized( lock )
{
x = true;
}
// in thread B
synchronized( lock )
{
System.out.println( x );
}
В этом случае гарантируется, что поток B будет видеть x==true
, пока поток A уже прошел этот synchronized
-блок. Сейчас я нахожусь в процессе переписывания большого количества кода, чтобы использовать более гибкие (и, как говорят, более быстрые) блокировки в java.util.concurrent
, особенно ReentrantReadWriteLock
. Итак, пример выглядит так:
РЕДАКТИРОВАТЬ : пример был разбит, потому что я неправильно преобразовал код, как отмечено matt b . Исправлено следующим образом:
// in thread A
lock.writeLock().lock();
{
x = true;
}
lock.writeLock().unlock();
// in thread B
lock.readLock().lock();
{
System.out.println( x );
}
lock.readLock().unlock();
Однако в спецификации модели памяти я не видел никаких намеков на то, что такие блокировки также подразумевают необходимость упорядочения. Рассматривая реализацию, она, похоже, полагается на доступ к переменным переменным внутри AbstractQueuedSynchronizer
(по крайней мере, для реализации sun). Однако это не является частью какой-либо спецификации, и, кроме того, доступ к энергонезависимым переменным в действительности не учитывается барьером памяти, заданным этими переменными, не так ли?
Итак, вот мои вопросы:
- Безопасно ли принимать тот же порядок, что и со "старыми"
synchronized
блоками?
- Это где-то задокументировано?
- Доступ к любой изменчивой переменной является барьером памяти для любой другой переменной?
С уважением,
Штеффен
-
Комментарий к Янамону:
Посмотрите на следующий код:
// in thread a
x = 1;
synchronized ( a ) { y = 2; }
z = 3;
// in thread b
System.out.println( x );
synchronized ( a ) { System.out.println( y ); }
System.out.println( z );
Из того, что я понял, барьер памяти заставляет второй вывод показывать 2, но не оказывает гарантированного влияния на другие переменные ...? Итак, как это можно сравнить с доступом к изменчивой переменной?