Ist das flüchtige Schlüsselwort für Felder erforderlich, auf die über ein ReentrantLock zugegriffen wird?

Meine Frage bezieht sich darauf, ob die Verwendung eines ReentrantLock die Sichtbarkeit eines Feldes in derselben Hinsicht garantiert, die das synchronisierte Schlüsselwort bietet.

Zum Beispiel in der folgenden KlasseA, das FeldsharedData muss nicht als flüchtig deklariert werden, da das synchronisierte Schlüsselwort verwendet wird.

class A 
{
  private double sharedData;

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

Ist jedoch für das nächste Beispiel mit einem ReentrantLock das flüchtige Schlüsselwort auf dem Feld erforderlich?

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

Ich weiß, dass die Verwendung des volatile-Schlüsselworts wahrscheinlich nur einen winzigen Leistungseinbruch zur Folge hat, aber ich möchte trotzdem korrekt codieren.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage