Java 通过ReentrantLock访问的字段是否需要volatile关键字?
我的问题是使用ReentrantLock是否保证字段的可见性与synchronized关键字提供的可见性相同 例如,在下面的类A中,使用synchronized关键字时,不需要将字段sharedData声明为volatileJava 通过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
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
循环如何与锁交互的更具体的细节,就不可能说了。你可能想用一个具体的例子来创建一个新问题。