2012-09-15 46 views
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. 其他線程獲取鎖,並且環...

之前發生關係是公正和正確的4間3?
或1和3之間也保證發生之前的關係?所以2保證內存可見性?

+0

當一個同步方法退出時,它會自動建立與同一對象的同步方法的任何後續調用的happen-before關係。這保證了對所有線程都可見的對象狀態的更改。 http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html – nullpotent

+0

發生這種情況 - 之前是在兩個同步塊之間。在顯式鎖定的情況下,在釋放鎖定和獲取鎖定之間。不在獲取鎖定和釋放之間。 –

+0

你有很多關於內存可見性的問題,但是你似乎並不瞭解java同步的基礎知識?我建議先閱讀[java concurrency](http://docs.oracle.com/javase/tutorial/essential/concurrency/),以便在瞭解這些基本知識之前瞭解基礎知識。 – jtahlborn

回答

1

有沒有這樣的事情,一個CPU可以獲得的同步監視器。監視器是一種構造,它是在您正在編程的語言(在本例中爲java)的運行時執行的。

java運行時負責此鎖定並禁止其他代碼進入同步代碼塊。 CPU只是看到處理它的指令。

關於你的緩存問題:cpu不只是決定刷新緩存。緩存保持原樣,直到被覆蓋。

相關問題