我的问题是关于ReentrantLock的使用是否可以保证字段的可见性(与synced关键字提供的方面相同)。

例如,在以下类A中,由于使用了synced关键字,因此无需将字段sharedData声明为volatile。

class A
{
  private double sharedData;

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

对于下一个使用ReentrantLock的示例,该字段上的volatile关键字是否必要?
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();
    }
  }
}

我知道无论如何使用volatile关键字只会对性能造成微不足道的影响,但我仍然想正确编码。

最佳答案

没有波动是安全的。 ReentrantLock实现Lock,并且docs for Lock 包括以下内容:

09-25 20:40