2012-08-13 74 views
0

如果我使用​​,那麼正在同步的對象必須是staticJava - 同步方法/塊

編輯: 我的意思是說對象的引用必須是靜態的。我注意到我正在閱讀的其中一個示例說,爲了讓線程在類A中使用同步方法,那麼對類A的引用必須是靜態的。

所以,我想知道是否是一個規則,使對一個對象的引用靜態,以便所有調用synchronized方法的線程都使用同一個副本的實例。在我的示例中,同步方法用於從1到10進行計數。因此,訪問此同步方法的每個線程應該每個計數爲1到10.我嘗試了這種方法,但沒有使用靜態方法,結果不正確。

+0

什麼喲意思*靜態*? – 2012-08-13 03:18:42

+0

引用對象的字段可能是「靜態」的,而不是對象本身。 – 2012-08-13 04:15:09

回答

1

在過度輕視這種風險:

  1. 檢查代碼,並確定組資源,或數據的,將通過將在併發線程運行的代碼進行訪問。要考慮的代碼可能跨越多個方法,可能是類。

  2. 一般情況下,同步上代表組資源的東西:

    • 如果組資源的全部對象實例數據(非靜態的),那麼它是可以接受的在擁有數據的對象上進行同步。(如果那個對象不是'這個',問自己很多問題!)。

    • 如果組資源的任何部分是靜態類的數據,則必須在代表靜態數據的東西同步。這可能是class本身。 (也知道原始值不是對象)。

    • 對於任何給定的資源集合總是鎖定相同的東西。這確保線程競爭相同的資源集合正在相互協調。

  3. 如果你正在考慮兩個這樣的資源集的,不能有任何一個項目屬於兩個集合。如果是這種情況,他們必須成爲一個單一的資源集合

  4. 如果在同一個對象的方法無法從集標識的資源的競爭(讀或寫)爲任何(1),則該方法可能無法需要同步。然而,如果該方法將被同時使用則認爲:

    • 如果這樣的方法從另一組資源的確實訪問數據,那麼將需要同步到集。參見(3)。

Read this to understand how the sychronized keyword works for static vs instance methods

+0

謝謝!這澄清了一切。 – user547453 2012-08-13 05:45:37

+0

Richard ......我有另一個問題....是否有可能在我鎖定的對象中存在其他非同步方法,並且其他線程是否可以訪問它們? – user547453 2012-08-13 05:53:03

+0

@ user547453編輯回答您的最後一個問題。 – 2012-08-13 06:00:43

0

不一定。

如果您正在構建一個Web應用程序(例如),並且每個客戶端會話都在特定於會話的對象列表上工作(例如,每個用戶的書籍列表),那麼您的線程可以閱讀您的當我的線程正在更新我的書籍列表時,圖書清單。

1

對象不能是靜態或非靜態的:該屬性僅適用於變量。所有對象同樣生活在堆上,直到他們不能通過從「根」的引用而到達,不再是

對於同步,我們需要對象本身(而不是持有引用的變量),所以如果對這些對象的引用是由靜態,非靜態或局部變量持有的話,它們沒有區別。

1

不是object這是靜態或者非靜態,其數據,其狀態的保護,併發問題。

1.​​是用於當2以上線程訪問相同的對象的關鍵字。

2.同步的目的是防止重要數據的國家。

3.object具有Lock and a Key,所以以保護數據這是一個instance variable,一個object's key被使用。

4.類似地,以保護State of the Data這是static,即(類的數據),class's key被使用。

+0

謝謝庫馬爾.........。 – user547453 2012-08-13 05:55:04

+0

歡迎您 – 2012-08-13 09:43:36

0

我們不同步對象。我們同步一段代碼(可能是​​塊中的方法或代碼),以便一次只有一個線程可以通過該塊。對象提供了鎖,如果線程已經在該代碼塊中運行,則該鎖用於防止其他線程進入該代碼塊。如果對該對象的引用是關於線程同步的static並不重要,但是請注意,您不能在靜態方法中使用非靜態變量。