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.¿La palabra clave volátil es necesaria para los campos a los que se accede a través de ReentrantLock?
Por ejemplo, en la siguiente clase A, el campo Datos_compartidos no necesita ser declarado volátil como 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 utilizando un ReentrantLock, sin embargo, ¿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();
}
}
}
Yo sé que el uso de la palabra clave volátil de todos modos será probablemente sólo imponer un impacto en el rendimiento minúscula, pero todavía me gustaría para codificar correctamente.
¿Este consejo es verdadero con respecto a 'while (field)' debido al levantamiento de campo? – Pod
@Pod: sin detalles más específicos de cómo el bucle 'while' interactúa con el bloqueo, es imposible de decir. Probablemente desee crear una nueva pregunta con un ejemplo específico. –