这是代码从某处复制到互联网:
这种显式锁定如何工作?
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是保证内存可见性吗?
答案 0 :(得分:1)
没有cpu可以获取的同步监视器。监视器是在您编程的语言的运行时中实现的构造,在本例中为java。
java运行时负责此锁定并禁止其他代码输入同步的代码块。 cpu只看到处理它的指令。
关于你的缓存问题:cpu不只是决定刷新缓存。缓存保持不变,直到被覆盖。