2009-10-15 14 views
23

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.

Respuesta

28

Es seguro sin volatilidad. ReentrantLock implementa Lock, y el docs for Lock incluyen lo siguiente:

Todos Lock implementaciones deben cumplir la misma sincronización de la memoria semántica de la manera prevista por la incorporada en bloqueo del monitor, como se describe en The Java especificación del lenguaje, tercera edición (Modelo 17.4 de memoria):

  • Un éxito lock operación tiene los mismos efectos sincronización memoria como una acción exitosa Lock.
  • Un éxito unlock operación tiene la misma memoria efectos de sincronización como un éxito Unlock acción .
+0

¿Este consejo es verdadero con respecto a 'while (field)' debido al levantamiento de campo? – Pod

+0

@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. –

Cuestiones relacionadas