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 deLock
exitosa.- Una operación de
unlock
exitosa tiene los mismos efectos de sincronización de memoria que una acción deUnlock
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.