Java 通过ReentrantLock访问的字段是否需要volatile关键字?

Java 通过ReentrantLock访问的字段是否需要volatile关键字?,java,concurrency,locking,volatile,reentrancy,Java,Concurrency,Locking,Volatile,Reentrancy,我的问题是使用ReentrantLock是否保证字段的可见性与synchronized关键字提供的可见性相同 例如,在下面的类A中,使用synchronized关键字时,不需要将字段sharedData声明为volatile class A { private double sharedData; public synchronized void method() { double temp = sharedData; temp *= 2.5; shar

我的问题是使用ReentrantLock是否保证字段的可见性与synchronized关键字提供的可见性相同

例如,在下面的类A中,使用synchronized关键字时,不需要将字段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关键字只会对性能造成很小的影响,但我仍然希望正确编码。

没有volatile是安全的
ReentrantLock
实现了
Lock
,其中包括:

所有
Lock
实现必须强制执行 相同的内存同步 由内置函数提供的语义 监视器锁,如Java中所述 语言规范,第三版 (17.4内存模型):

  • 成功的
    锁定
    操作具有 与相同的内存同步效果 成功的
    锁定
    操作
  • 成功的
    解锁
    操作具有相同的内存 同步效果作为 成功的
    解锁
    操作

对于由于现场吊装而导致的
while(field)
,这个建议是否正确?@Pod:如果没有关于
while
循环如何与锁交互的更具体的细节,就不可能说了。你可能想用一个具体的例子来创建一个新问题。