私の質問は、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 キーワードを使用してもパフォーマンスへの影響はごくわずかであることはわかっていますが、それでも正しくコーディングしたいと考えています。