簡體   English   中英

Java-同步方法/塊

[英]Java - synchronized method/ block

如果我使用的是synchronized對象,那么被同步的對象是否必須是static

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

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

對象不能是靜態的或非靜態的:此屬性僅適用於變量。 所有對象都同樣生活在堆中,直到他們無法通過從“根”的引用可以達到了。

為了進行同步,我們需要對象本身(而不是持有引用的變量),因此,如果對這些對象的引用是由靜態,非靜態或局部變量持有的,則沒有區別。

不是 靜態的或非靜態 object而是 其狀態被保護以防止並發問題的數據。

1. synchronized是一個關鍵字,當2個或更多線程訪問同一對象時使用。

2.同步是關於保護關鍵數據的狀態。

3.每個object都有一個Lock and a Key ,因此為了保護作為 instance variableData ,使用了object's key

4.同樣,以保護State of the Datastatic ,即(類數據), class's key使用。

冒着過於瑣碎的風險:

  1. 檢查代碼並標識將在並發線程上運行的代碼將訪問的資源或數據集 要考慮的代碼可能跨越多個方法,可能包括類。

  2. 通常,在代表資源集合的東西上進行同步:

    • 如果資源集都是對象實例數據(非靜態),那么可以在擁有數據的對象上進行同步。 (如果該對象不是'this',請問自己很多問題!)。

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

    • 對於任何給定的資源,總是鎖定同一件事。 這樣可確保爭用同一組資源的線程彼此之間正確協調。

  3. 如果要考慮兩組這樣的資源 ,則不能有任何一項屬於這兩組資源。 如果是這樣,它們必須成為一組資源

  4. 如果在同一對象中有不競爭(讀或寫)方法(1)中標識的資源集中的 任何方法,則該方法可能不需要同步。 但是,如果將同時使用該方法,請考慮:

    • 如果這種方法確實從另一組資源訪問數據,則需要將其同步到該資源。

    • 參見(3)。

閱讀sychronized可了解sychronized關鍵字如何用於靜態方法與實例方法

不必要。

如果您正在構建一個Web應用程序(例如),並且每個客戶端會話都在處理該會話特定的對象列表(例如,每個用戶的書籍列表),那么您的線程可以在閱讀該書籍列表的同時我的主題正在更新我的書籍清單。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM