執行緒間的共享和協作

2021-10-23 04:30:57 字數 1552 閱讀 4862

執行緒間的協作

synchroniezd 可以修飾方法或者以同步塊的方式使用。它可以確保多個執行緒在同一時刻,只能有乙個執行緒處於方法或者同步**塊中,保證了執行緒對於變數的訪問的可見性與排他性,又稱之為內鎖機制。

物件鎖和類鎖:

物件鎖是用於物件例項方法,或者乙個物件例項上的,類鎖是用於類的靜態方法或者乙個類的 class 物件上的。

類鎖只是乙個概念上的東西,並不是真實存在的,類鎖其實鎖的是每個類的對應的 class 物件。類鎖和物件鎖之間也是互不干擾的。

volatile 保證了不同執行緒對於這個變數進行操作時的可見性。即乙個執行緒修改了某變數的值,這個新值對於其他執行緒來說時立即可見的。試用場景:乙個執行緒寫,多執行緒讀。

threadlocal 為每個執行緒提供了變數的副本,使得每個執行緒在某一時間訪問的並非同一物件,隔離了多個執行緒間的資料共享。

void set(object value) 設定當前執行緒的區域性變數。

public object get() 返回當前執行緒所對應的執行緒區域性變數。

public void remove() 將當前執行緒區域性變數的值刪除。

protected object initialvalue() 返回該執行緒區域性變數的初始值。

notify():通知乙個在物件上等待的執行緒,使其從 wait 方法返回,而返回的前提是該執行緒獲取到了物件的鎖,沒有獲得鎖的執行緒重新進入 waiting 狀態。

notifyall():通知所有等待在該物件上的執行緒

wait():呼叫該方法的執行緒進入 waiting 狀態,只有等待另外執行緒的通知或被中斷

才會返回.需要注意,呼叫 wait()方法後,會釋放物件的鎖

wait(long):超時等待一段時間,這裡的引數時間是毫秒,也就是等待長達n 毫秒,如果沒有通知就超時返回

wait (long,int) :對於超時時間更細粒度的控制,可以達到納秒

等待方遵循如下原則:

1)獲取物件的鎖。

2)如果條件不滿足,那麼呼叫物件的 wait()方法,被通知後仍要檢查條件。

3)條件滿足則執行對應的邏輯。

synchroniezd(物件)  

對應的處理邏輯

}

通知方遵循如下原則。

1)獲得物件的鎖。

2)改變條件。

3)通知所有等待在物件上的執行緒。

synchroniezd(物件)
在呼叫 wait()、notify()系列方法之前,執行緒必須要獲得該物件的物件級

別鎖,即只能在同步方法或同步塊中呼叫 wait()方法、notify()系列方法.

notify 和 notifyall 應該用誰?

盡可能用 notifyall(),謹慎使用 notify(),因為 notify()只會喚醒乙個執行緒,我

們無法確保被喚醒的這個執行緒一定就是我們需要喚醒的執行緒。

執行緒 同步執行緒和協作執行緒

1 同步塊 實現 package edu.xalead public class 吃包子 extends thread public synchronized void eat public void run catch interruptedexception e 多執行緒的爭用問題 會出現兩個執...

詳述執行緒間協作

例如 synchronized關鍵字只是起到了多個執行緒 序列 執行臨界區中 的作用,但是哪個執行緒先執行,哪個執行緒後執行依無法確定,object類中的wait notify 和notifyall 三個方法解決了執行緒間的協作問題,通過這三個方法的 合理 使用可以確定多執行緒中線程的先後執行順序 ...

執行緒間的協作同步

幫朋友看時候學了一下這方面知識 有錯誤請糾正 wait notify 和notifyall condition 在condition物件中,與wait,notify和notifyall方法對應的分別是await,signal,signalall。但是,condition對object進行了擴充套件,...