我的问题是关于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
包括以下内容: