java concurrency locking volatile reentrant

java - ¿Es necesaria la palabra clave volátil para los campos a los que se accede a través de ReentrantLock?



concurrency locking (1)

Es seguro sin volatilidad. ReentrantLock implementa Lock , y los documentos para Lock incluyen esto:

Todas las implementaciones de Lock deben imponer la misma semántica de sincronización de memoria proporcionada por el bloqueo del monitor incorporado, como se describe en Especificación del lenguaje Java, tercera edición (17.4 Modelo de memoria):

  • Una operación de lock exitosa tiene los mismos efectos de sincronización de memoria que una acción de Lock exitosa.
  • Una operación de unlock exitosa tiene los mismos efectos de sincronización de memoria que una acción de Unlock exitosa.

Mi pregunta se refiere a si el uso de ReentrantLock garantiza la visibilidad de un campo en el mismo sentido que proporciona la palabra clave sincronizada.

Por ejemplo, en la siguiente clase A , el campo sharedData no necesita ser declarado volátil a medida que se utiliza la palabra clave sincronizada.

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

Para el siguiente ejemplo usando un ReentrantLock, ¿es necesaria la palabra clave volátil en el campo?

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(); } } }

Sé que el uso de la palabra clave volátil de todos modos probablemente solo imponga un golpe de rendimiento minúsculo, pero me gustaría seguir codificando correctamente.