1

これはインターネットのどこかからコピーされたコードです:
この明示的なロックはどのように機能しますか?

public class Lock {
  private Object lockObj = new Object();
  private Thread owner;
  private int lockCount;

  /**
   * Waits for up to 'maxWait' milliseconds to acquire the lock,
   * and returns true if the lock was acquired.
   **/
  public boolean acquireLock(int maxWait) throws InterruptedException {
    Thread currentThread = Thread.currentThread();
    synchronized (lockObj) {
      if (owner == currentThread) {
        lockCount++;
        return true;
      }
      long waitedSoFar = 0L;
      while (owner != null) {
        long t0 = System.currentTimeMillis();
        long timeToWait = maxWait - waitedSoFar;
        if (timeToWait <= 0)
          return false;
        lockObj.wait(timeToWait);
        if (owner != null) {
          waitedSoFar += System.currentTimeMillis() - t0;
        }
      }
      owner = currentThread;
      lockCount = 1;
      return true;
    }
  }
  public void releaseLock() {
    Thread currentThread = Thread.currentThread();
    synchronized (lockObj) {
      if (owner == currentThread) {
        lockCount--;
        if (lockCount == 0) {
          owner = null;
          lockObj.notify();
        }
        return;
      } else {
        // Only the owner can release the lock!
        throw new IllegalStateException();
      }
    }
  }
}

メモリの可視性を保証する特別なコードは見たことがありません。同時実行に関連するのは「synchronized(lockObj){ ... }」だけです

それは魔法ですか?
CPU は、同期モニターを取得する前にすべてのキャッシュをフラッシュしますか?
それとも反対?
同期モニターをリリースするときに、CPU はすべてのキャッシュをフラッシュしますか?

編集:
まあ、同時実行待機/通知に関連する他のものを手に入れました。

考えてみてください。この明示的なロックはどのように機能しますか?

  1. ロックを取得し、変数を変更して (他のスレッドが取得できないように)、ロックを解放します。
  2. 何でもする。
  3. ロックを取得し、変数を変更します(他のスレッドがそれを取得できるようにするため)。
  4. 他のスレッドがロックを取得し、ループします...

事前発生の関係は 3 と 4 の間ですよね?
または、1 と 3 の間でも発生前の関係が保証されますか? では、2 はメモリの可視性が保証されているのでしょうか?

4

1 に答える 1

1

CPUが取得できる同期モニターなどはありません。モニターは、プログラミングしている言語 (この場合は Java) のランタイムに実装される構造です。

Java ランタイムは、このロックを行い、他のコードが同期されたコード ブロックに入ることを禁止します。CPUは、それを処理する命令を見るだけです。

キャッシュに関する質問について: CPU はキャッシュをフラッシュすることを決定するだけではありません。キャッシュは、上書きされるまで保持されます。

于 2012-09-15T09:50:33.567 に答える