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是否只刷新其所有緩存?
編輯:
那麼,我得到了一些其他事情有關的併發等待/通知。
想一想。這個明確的鎖如何工作?
- 獲取鎖,修改變量(阻止其他線程獲取它),然後釋放鎖。
- 可以做任何事情。
- 獲取鎖定,修改變量(允許其他線程獲取它)。
- 其他線程獲取鎖,並且環...
之前發生關係是公正和正確的4間3?
或1和3之間也保證發生之前的關係?所以2保證內存可見性?
當一個同步方法退出時,它會自動建立與同一對象的同步方法的任何後續調用的happen-before關係。這保證了對所有線程都可見的對象狀態的更改。 http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – nullpotent
發生這種情況 - 之前是在兩個同步塊之間。在顯式鎖定的情況下,在釋放鎖定和獲取鎖定之間。不在獲取鎖定和釋放之間。 –
你有很多關於內存可見性的問題,但是你似乎並不瞭解java同步的基礎知識?我建議先閱讀[java concurrency](http://docs.oracle.com/javase/tutorial/essential/concurrency/),以便在瞭解這些基本知識之前瞭解基礎知識。 – jtahlborn