2017-10-14 33 views
0

從Java併發Pactice爲什麼Java對象可以像鎖和條件隊列一樣工作?

每個Java對象可以隱含充當用於同步目的的鎖定;這些內置的鎖稱爲內部鎖或鎖監視器。

什麼是「每個Java對象都可以隱式作爲鎖?」是什麼意思?

這是否意味着每個Java對象的類實現Lock接口如下?

public interface Lock {  
    void lock(); 
    void lockInterruptibly() throws InterruptedException; 
    boolean tryLock(); 
    boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException; 
    void unlock(); 
    Condition newCondition();  
} 

這是否意味着每類Java對象提供了一些方法,使物體的行爲就像一把鎖,鴨打字的感覺?

正如每個Java對象可以作爲一個鎖作用,每個對象也可以 充當條件隊列,和等待,通知,以及對象notifyAll的 方法構成了內在條件隊列API。

「每個對象還可以充當條件隊列」是什麼意思?

這是否意味着類中的每個Java對象

  • 的實現了一些「條件隊列」界面,或
  • 提供了一些方法,使物體的行爲像鴨打字意義上的條件隊列?

謝謝。

+2

「這是否意味着每個Java對象的類都實現瞭如下的Lock接口?」不,它意味着任何對象都可以用作'synchronized(表達式){...}'中的表達式。 –

+0

謝謝。 'synchronized'是什麼類型的對象在圓括號中? – Ben

+2

[任何引用類型](https://docs.oracle.com/javase/specs/jls/se9/html/jls-14.html#jls-14.19)。這纔是重點。 –

回答

1

不,這並不意味着每一個類實現了Lock接口(事實上,該接口被引進的想法,每個對象都有一個隱式監視器這一直是各地實際,因爲之後創建一個十年或更長時間Java的引入)。

它僅意味着,每一個對象具有一隱式監視器,允許它被用作簡單的互斥,如下所示:

synchronized (someObject) { 
    // this region is protected from concurrent execution by other threads 
    // locking on the same object 
} 

它還可在更復雜的監控用例如wait()被使用並且notify(),這是什麼讓它作爲一種條件變量(這可能是另一個名稱條件變量?)。

利益與決策的缺點是有點激烈辯論:雖然它確實意味着你不需要單獨的互斥體或條件變量的對象,它把在實施負擔,因爲任何對象可以以這種方式使用,儘管可能是有史以來最小的一小部分物體。有很多實施技巧用於降低成本。

從Java 5開始,現在有許多由JDK提供的顯式同步原語,包括各種Lock實現。

相關問題