¿Se requiere la palabra clave volátil para los campos a los que se accede a través de ReentrantLock?

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

Por ejemplo, en la siguiente clase.A, el campodatos compartidos no necesita ser declarado volátil ya que se usa la palabra clave sincronizada.

class A 
{
  private double sharedData;

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

Sin embargo, para el siguiente ejemplo de uso de 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 impondrá un impacto de rendimiento minúsculo, pero todavía me gustaría codificar correctamente.

Respuestas a la pregunta(1)

Su respuesta a la pregunta