首頁體育 > 正文

所有Java開發都必須知道的知識點:synchronized三種使用方式

2021-12-15由 科技新聞速遞 發表于 體育

本篇文章主要介紹

Java提供的synchronized同步關鍵字的三種使用方式以及使用上的區別

。本篇文章的主要目的是讓大家對synchronized關鍵字有個基本認識(照顧初級同學,大佬可以直接略過),

後續會發布一篇深度剖析synchronized內部實現原理以及JDK1.6最佳化後的鎖升級過程(無鎖->偏向鎖->輕量級鎖->重量級鎖)的文章

供大家學習參考。

synchronized簡單介紹

synchronized是Java提供的一個同步處理的關鍵字

,可以保證同一時刻只有一個執行緒能夠進入該方法(程式碼塊),同時也是Java中解決併發問題的一種最常用最簡單的方法。

JDK1.6之前synchronized採用重量級鎖的方式進行同步處理(效率低),JDK1.6之後進行了最佳化根據不同情況選擇不同的鎖,存在一個鎖升級過程(效率高)。注:synchronized在JDK1.6之後鎖升級過程會在下一篇文章進行詳細介紹。

最後,

synchronized有三種使用方式:修飾例項方法、修飾靜態方法、同步程式碼塊

synchronized修飾例項方法

修飾例項方法使用的是物件級鎖,多個執行緒執行同一個物件中被 synchronized修飾的方法時同時有且只有一個執行緒能夠獲取物件鎖執行方法,其他執行緒等待。

所有Java開發都必須知道的知識點:synchronized三種使用方式

原始碼截圖-方便手機端使用者閱讀

i++並不是原子操作,而是首先讀取i,然後進行++,最後將算出的值賦值給i,所以當多個執行緒同時進行i++操作時結果是不預期的,我們這裡透過synchronized修飾increase方法保證increase方法的原子性,從而保證某個執行緒在進行i++操作的時候,其他執行緒是無法進行i++操作的,即順序執行。

synchronized修飾靜態方法

修飾靜態方法使用是當前類class物件鎖,多個執行緒執行同一類中被 synchronized修飾的靜態方法時有且只有一個執行緒能夠獲取當前類的class物件鎖執行方法,其他執行緒等待。

所有Java開發都必須知道的知識點:synchronized三種使用方式

原始碼截圖-方便手機使用者閱讀

synchronized修飾同步程式碼塊

修飾同步程式碼塊使用的是程式碼塊括號中的物件鎖,多個執行緒執行同一個被 synchronized的同步程式碼塊時有且只有一個執行緒能夠獲取程式碼塊括號中的物件鎖執行程式碼塊內容,其他執行緒等待。

所有Java開發都必須知道的知識點:synchronized三種使用方式

由結果可知,被synchronized修飾的程式碼塊保證了多執行緒通知訪問同時只有一個執行緒能夠進入程式碼塊中,保證了i被多執行緒處理的安全,y則在多執行緒處理過程中出現了不可預期的結果。

synchronized總結歸納

synchronized雖然有3種使用方式,但是總的來說synchronized都是控制物件的lock和unlock操作。一個執行緒取得被synchronized修飾的方法(例項或者靜態)/程式碼塊的執行資源時,控制的物件進行被鎖定,然後執行具體內容,結束時物件解鎖,其他執行緒即可競爭從而執行相關方法/程式碼塊。

注:使用synchronized關鍵字修飾的同步塊儘可能小(在不影響正常業務流程的情況下)。

END

筆者是一位熱愛網際網路、熱愛網際網路技術、熱於分享的年輕人,如果您跟我一樣,我願意成為您的朋友,分享每一個有價值的知識給您。喜歡作者的同學,點贊+轉發+關注哦!

點贊+轉發+關注

,私信作者“

讀書筆記

”即可獲得

BAT大廠面試資料、高階架構師VIP影片課程

等高質量技術資料。

所有Java開發都必須知道的知識點:synchronized三種使用方式

BAT等一線網際網路面試資料和VIP高階架構師影片

頂部