28

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

4

1 に答える 1

32

揮発性がなく安全です。ReentrantLock実装Lockし、ドキュメントにLockはこれが含まれています:

The Java Language Specification, Third Edition (17.4 Memory Model) で説明されているように、すべてのLock実装で、組み込みのモニター ロックによって提供されるものと同じメモリ同期セマンティクスを適用する必要があります。

  • 操作の成功には、アクションlockの成功と同じメモリ同期効果があります。Lock
  • 操作の成功 には、アクションunlockの成功と同じメモリ同期効果があります。Unlock
于 2009-10-15T06:24:06.377 に答える