我的问题是关于使用 ReentrantLock 是否能保证字段的可见性与 synchronized 关键字提供的相同。
例如,在下面的类A中,字段sharedData不需要声明为 volatile,因为使用了 synchronized 关键字。
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 关键字只会对性能造成很小的影响,但我仍然想正确编码。