これはインターネットのどこかからコピーされたコードです:
この明示的なロックはどのように機能しますか?
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 はすべてのキャッシュをフラッシュしますか?
編集:
まあ、同時実行待機/通知に関連する他のものを手に入れました。
考えてみてください。この明示的なロックはどのように機能しますか?
- ロックを取得し、変数を変更して (他のスレッドが取得できないように)、ロックを解放します。
- 何でもする。
- ロックを取得し、変数を変更します(他のスレッドがそれを取得できるようにするため)。
- 他のスレッドがロックを取得し、ループします...
事前発生の関係は 3 と 4 の間ですよね?
または、1 と 3 の間でも発生前の関係が保証されますか? では、2 はメモリの可視性が保証されているのでしょうか?