三 多執行緒基礎之synchronized

2021-10-25 20:09:14 字數 2735 閱讀 6877

二.多執行緒基礎之 volatile

三.多執行緒基礎之synchronized

四.多執行緒使用及執行緒間的通訊

五.多執行緒高階之鎖

六.多執行緒併發之容器

七.原子類和 cas

八.併發工具類

九.執行緒池

它主要確保多個執行緒 在同乙個時刻,只能有乙個執行緒處於方法或者同步塊中,它保證了執行緒對變數訪問的可見性 和排他性。

3.1 synchrocized 關鍵字目的是什麼?

**synchronized關鍵字解決的是多個執行緒之間訪問資源的同步性,synchronized關鍵字可以保證被它修飾的方法或者**塊在任意時刻只能有乙個執行緒執行。**它保證了執行緒對變數訪問的可見性 和排他性。

3.2 synchroized 你是如何使用的

synchronized 關鍵字最主要的三種使用方式:

1.修飾例項方法:作用於當前物件例項加鎖,進入同步**前要獲得當前物件例項的鎖

synchronized

void

method()

2.修飾靜態方法:也就是給當前類加鎖,會作用於類的所有物件例項 ,進入同步**前要獲得當前 class 的鎖。因為靜態成員不屬於任何乙個例項物件,是類成員( static 表明這是該類的乙個靜態資源,不管 new 了多少個物件,只有乙份)。所以,如果乙個執行緒 a 呼叫乙個例項物件的非靜態synchronized方法,而執行緒 b 需要呼叫這個例項物件所屬類的靜態synchronized方法,是允許的,不會發生互斥現象,因為訪問靜態synchronized方法占用的鎖是當前類的鎖,而訪問非靜態synchronized方法占用的鎖是當前例項物件鎖

synchronized

static

void

method()

3.修飾**塊:指定加鎖物件,對給定物件/類加鎖。synchronized(this|object)表示進入同步**庫前要獲得給定物件的鎖synchronized(類.class)表示進入同步**前要獲得當前 class 的鎖

synchronized

(this

)

總結:

答題思路: 三種方法 和 他們鎖的物件的區別

3.3 synchrozied 的實現原理是什麼?

​ 通過檢視同步方法的位元組碼資訊,對於同步塊的實現使用了monitorenter和monitorexit指令,其本質是對一 個物件的監視器(monitor)進行獲取,而這個獲取過程是排他的,也就是同一時刻只能有乙個 執行緒獲取到由synchronized所保護物件的監視器。沒有獲 取到監視器(執行該方法)的執行緒將會被阻塞在同步塊和同步方法的入口處,進入blocked 狀態。

​ 任意執行緒對object(object由synchronized保護)的訪問,首先要獲得 object的監視器。如果獲取失敗,執行緒進入同步佇列,執行緒狀態變為blocked。當訪問object 的前驅(獲得了鎖的執行緒)釋放了鎖,則該釋放操作喚醒阻塞在同步佇列中的執行緒,使其重新 嘗試對監視器的獲取。

jvm基於進入和退出monitor物件來實現方法同步和**塊同步, 但是兩者的實現細節不一樣.

**塊同步: 通過使用monitorenter和monitorexit指令實現的.

同步方法: acc_synchronized修飾

答題思路: 監視器,monitor.enter,monitor.exit,阻塞

3.4 synchroized 鎖在1.6之後有了哪些優化,介紹一下

synchronized 這個鎖優化之前是重量級鎖

3.4.1 自旋鎖

互斥同步進入阻塞狀態的開銷都很大,應該盡量避免。在許多應用中,共享資料的鎖定狀態只會持續很短的一段時間。自旋鎖的思想是讓乙個執行緒在請求乙個共享資料的鎖時執行忙迴圈(自旋)一段時間,如果在這段時間內能獲得鎖,就可以避免進入阻塞狀態。

自旋鎖適應場景:它只適用於共享資料的鎖定狀態很短的場景。

自旋鎖缺陷:雖然能避免進入阻塞狀態從而減少開銷,但是它需要進行忙迴圈操作占用 cpu 時間

3.4.2 鎖消除

鎖消除是指對於被檢測出不可能存在競爭的共享資料的鎖進行消除。

3.4.3 鎖粗化

如果一系列的連續操作都對同乙個物件反覆加鎖和解鎖,頻繁的加鎖操作就會導致效能損耗。

鎖消除主要是通過逃逸分析來支援,如果堆上的共享資料不可能逃逸出去被其它執行緒訪問到,那麼就可以把它們當成私有資料對待,也就可以將它們的鎖進行消除。

3.4.4 輕量級鎖

輕量級鎖是相對於傳統的重量級鎖而言,它使用 cas 操作來避免重量級鎖使用互斥量的開銷。對於絕大部分的鎖,在整個同步週期內都是不存在競爭的,因此也就不需要都使用互斥量進行同步,可以先採用 cas 操作進行同步,如果 cas 失敗了再改用互斥量進行同步

3.4.5偏向鎖

​ 第乙個嘗試加鎖的執行緒 不會真正的加鎖 而是進入偏向鎖(一種很輕量的鎖) 直到其他執行緒也來競爭這把鎖的時候 才會取消偏向鎖的狀態 真正的進行加鎖

三 多執行緒斷點續傳

conn.setrequestmethod get 獲取檔案總長度,然後建立長度一致的臨時檔案 向伺服器請求部分資料 conn.setrequestproperty range bytes startindex endindex conn.connect if conn.getresponsecod...

C 高階特性(三)多執行緒

1,鎖 控制多執行緒併發操作時,執行緒安全問題。舉例 static bool done 執行緒是否完成標識 static object locker new object 執行緒鎖 static void main string args static void test 結果 done.threa...

三 多執行緒與上廁所

世界上最讓人坐立不安,最知道心急的時候,是拿著手紙捂著肚子而廁所裡有人的時候。現在我們有兩個人,乙個在廁所裡,乙個在廁所外。廁所外的人一直問 你好了沒?while 廁所裡的人沒出來 這個時候就會變成,裡面的人拉的不舒服,外面的人也難受。現在我們把條件放寬一點,假如外面的人不是很急,那麼他還是這麼問的...