2009-10-15 3 views
23

Мой вопрос относится к тому, что использование ReentrantLock гарантирует видимость поля в том же отношении, что и синхронизированное ключевое слово.Требуется ли ключевое слово volatile для полей, доступных через ReentrantLock?

Например, в следующем классе , поле sharedData не должны быть объявлены летучим, как используется ключевое слово синхронизированы.

class A 
{ 
    private double sharedData; 

    public synchronized void method() 
    { 
    double temp = sharedData; 
    temp *= 2.5; 
    sharedData = temp + 1; 
    } 
} 

Для следующего примера, используя ReentrantLock, является ли волатильное ключевое слово на нужном поле?

class B 
{ 
    private final ReentrantLock lock = new ReentrantLock(); 
    private volatile double sharedData; 

    public void method() 
    { 
    lock.lock(); 
    try 
    { 
     double temp = sharedData; 
     temp *= 2.5; 
     sharedData = temp + 1; 
    } 
    finally 
    { 
     lock.unlock(); 
    } 
    } 
} 

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

ответ

28

Это безопасно без волатильности. ReentrantLock реализует Lock и docs for Lock включает в себя следующее:

Всех Lock реализации должны обеспечивать ту же синхронизацию памяти семантики, как это предусмотрено встроенные замок монитора, как описано в Java спецификации языка, третье издание (Модель 17.4 памяти):

  • успешный lock операция имеет же эффекты синхронизации памяти, как Успешно Lock действий.
  • Успешное unlock операция имеет те же памяти эффектов синхронизации в качестве успешного Unlock действия.
+0

Является ли этот совет верным относительно 'while (field)' из-за подъема поля? – Pod

+0

@Pod: без каких-либо конкретных подробностей о том, как петля 'while' взаимодействует с блокировкой, невозможно сказать. Вероятно, вы хотите создать новый вопрос с конкретным примером. –

Смежные вопросы