java執行緒同步之synchronized

2021-08-20 05:33:49 字數 1754 閱讀 2525

同步指的是呼叫乙個方法時,在沒有得到結果之前,這個呼叫就不返回。執行緒同步的意思與之類似,但執行緒同步並不是說讓乙個執行緒執行完了再執行其它執行緒,一般是指讓執行緒中的某一些操作進行同步就可以。

執行緒安全就是多執行緒訪問時,採用了加鎖機制,當乙個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。執行緒不安全主要是指多個執行緒對同乙個物件中的同乙個例項變數進行操作會出現值被更改、值不同步的情況,進而影響程式的執行流程。

使用synchronized同步:

1.物件鎖:

物件鎖,當不同執行緒同時呼叫同乙個物件的普通方法或者**塊時會進行同步,最先擁有該物件鎖的執行緒會先執行,其他執行緒阻塞等待鎖。

public

class synchronizemethod

public

void

method()

}}

2.類鎖:

針對於類級別的鎖,當不同執行緒同時呼叫該類的所有物件的同步方法或者**塊時會進行同步,最先擁有該物件鎖的執行緒會先執行,其他執行緒阻塞等待鎖。

public

class synchronizemethod

public

void

method()

}}

2.底層實現:synchronized底層是通過乙個物件監視器鎖(monitor)來實現的。

2.1 synchronized針對**塊加鎖時,**塊編譯後的位元組碼前後會出現monitorenter、monitorexit指令。

monitorenter:每個物件有乙個監視器鎖(monitor)。當monitor被占用時就會處於鎖定狀態,執行緒執行monitorenter指令時嘗試獲取monitor的所有權,過程如下:

1、如果monitor的進入數為0,則該執行緒進入monitor,然後將進入數設定為1,該執行緒即為monitor的所有者。

2、如果執行緒已經占有該monitor,只是重新進入,則進入monitor的進入數加1.

3.如果其他執行緒已經占用了monitor,則該執行緒進入阻塞狀態,直到monitor的進入數為0,再重新嘗試獲取monitor的所有權。

monitorexit:執行緒必須是object所對應的monitor的所有者。

指令執行時,monitor的進入數減1,如果減1後進入數為0,那執行緒退出monitor,不再是這個monitor的所有者。其他被這個monitor阻塞的執行緒可以嘗試去獲取這個 monitor 的所有權。

2.2 synchronized針對方法加鎖時,方法編譯會出現乙個acc_synchronized標誌符。

jvm就是根據該識別符號來實現方法的同步的:當方法呼叫時,呼叫指令將會檢查方法的 acc_synchronized 訪問標誌是否被設定,如果設定了,執行執行緒將先獲取monitor,獲取成功之後才能執行方法體,方法執行完後再釋放monitor。在方法執行期間,其他任何執行緒都無法再獲得同乙個monitor物件。 其實本質上沒有區別,只是方法的同步是一種隱式的方式來實現,無需通過位元組碼來完成。

結束語

java執行緒同步之CountDownLatch

1 類說明 jdk的concurrent包中的countdownlatch類是乙個執行緒同步的輔助類,它使得執行緒可以一直等待在其它執行緒中執行的操作,直到此操作結束。countdownlatch在初始化的時候指定乙個大小值n,呼叫countdownlatch的await方法的執行緒會陷入等待之中,...

java 執行緒 執行緒同步

threadlocal與其它同步機制的比較 threadlocal和其他所有的同步機制都是為了解決多執行緒中的對同一變數的訪問衝突。在普通的同步機制中,是通過對物件加鎖來實現多個執行緒對同一變數的安全訪問的。這時該變數是多個執行緒共享的,使用這種同步機制需要很細緻的分析在什麼時候對變數進行讀寫,什麼...

java同步執行緒

同步執行緒 synchronized方法 乙個類中任何方法都可以定義為synchronized方法以防止多執行緒資料崩潰。當某個物件用synchronized方法修飾時,表明該物件在任一時刻只能由乙個執行緒訪問。宣告方法體的一般格式 modifier synchronized returntype ...