2012-03-07 94 views
3

我見過在java中使用過多次的對象監視器,但在我看來,任何對象監視器邏輯可以很容易地被同步代碼塊和/或方法。是否真的有必要使用「監視器」對象(java)

使用顯式對象監視器的目的是什麼,而不僅僅是仔細協調同步代碼塊和原子基元?

+0

我認爲你必須對你的問題更具體。 「對象監視器邏輯」是什麼意思?在標準的Java術語中,當你使用「synchronized」時,你在監視器上獲得一個鎖。這是什麼讓你感到困惑? – Jochen 2012-03-07 21:00:21

+0

我見過對象聲明並用作監視器。我認爲你通常可以使用一個簡單的布爾或者同步塊,而不是用典型的monitor/notifyAll邏輯實現的任意對象。 – jayunit100 2012-03-07 21:12:33

回答

2

但我認爲任何對象監視器邏輯可以很容易地通過使用同步代碼塊和/或方法來代替。

是的,這是因爲一杯水可以很容易地被一杯水取代 - 同樣的事情。 Java的同步代碼塊和方法在語言級別上公開了monitor pattern

+0

我很喜歡它。我不同意這是一條評論。 – duffymo 2012-03-07 21:03:47

+0

@duffymo因爲它被編輯我想:) – 2012-03-07 21:05:03

4

總是有一個監視器對象。當你有同步塊時,你的類實例是監視器對象。 所以有理由使用明確的對象:

1)你可以類實例之間共享,以同步共享資源

2)更明確的訪問

3)你可以給你的監視器對象有幫助命名

4)更靈活

4

你讓並不存在區別(或使用不常見的術語)。用Java術語來說,監視器是用作同步塊的參數的對象(或者,在同步實例方法的情況下,隱式地使用this實例,並且使用同步靜態方法類實例)。

3

最主要的是一個正常的​​塊使用封閉的對象作爲它的監視器,換句話說,它等同於使用synchronized(this) { }。問題是範圍/可見性之一:類的外部任何類都可以選擇在同一實例上同步並干擾同步邏輯。通過使用private final引用作爲監視器,這不再可能(假設沒有反射shenanigans)。

這在Java Concurrency In Practice配方如下(P61,第4.2.1節):

有使用私人鎖定對象,而不是對象的內部鎖(或任何其他可公開訪問的鎖)的優點。使鎖對象專用封裝鎖,以便客戶端代碼無法獲取它,而可公開訪問的鎖允許客戶端代碼正確或不正確地參與其同步策略。不恰當地獲取另一個對象的鎖的客戶可能會導致活性問題,並且驗證可公開訪問的鎖是否正確使用需要檢查整個程序而不是單個類。

相關問題