多執行緒與synchronized關鍵字

2021-07-11 16:32:11 字數 1592 閱讀 7617

在寫這篇文章之前我看過一些關於多執行緒同步的文章,從他們的文章中總結了很多精華,也發現一些不足。很多文章都是從以下四個方面來分析的。

1、synchronized修飾乙個非靜態函式,例如synchronized method()

2、synchronized修飾乙個靜態函式,例如static synchronized method()

3、synchronized修飾乙個物件,例如synchronized(obj){}

4、synchronized修飾乙個類,例如synchronized(object.class){}

物件鎖:

問題1:乙個執行緒什麼時候獲得某個物件的物件鎖,又在什麼時候釋放該物件鎖呢?

當乙個執行緒執行obj.synchronized method(),或者執行synchronized(obj){}**塊時,該執行緒獲得物件obj的物件鎖。當該同步方法或者該**塊執行完畢時,該執行緒釋放obj的物件鎖。

結論1:執行緒1獲得物件obj的物件鎖之後,其他的執行緒若想獲得該物件鎖,需要等到執行緒1釋放該物件鎖

結論2:執行緒1執行obj.synchronized method()前,要先獲得obj的物件鎖

結論3:執行緒1執行synchronized(obj){}**塊前,要先獲得obj的物件鎖

類鎖:

問題1:乙個執行緒什麼時候獲得某個類的類鎖?又在什麼時候釋放該類鎖呢?

當乙個執行緒執行h.static synchronized method(),或者執行synchronized(h.class){}**塊時,該執行緒獲得該類h的類鎖。當該靜態同步方法或者同步**塊執行完畢時,該執行緒釋放該h的類鎖。

結論1:執行緒1獲得類h的類鎖之後,其他執行緒若想獲得該類鎖,需要等到執行緒1釋放該類鎖。

結論2:執行緒1執行h.static synchronized method()前,要先獲得類h的類鎖。

結論3:執行緒1執行synchronized(h.class){}**塊前,要先獲得類h的類鎖。

類鎖和同步鎖是相互不影響的

1、若類h的某個物件h1的物件鎖是空閒的,當乙個執行緒獲得了類h的類鎖之後,h1的物件鎖依然是空閒的

2、若類h的類鎖是空閒的,當乙個執行緒獲得類h的某個物件h1的物件鎖之後,h的類鎖依然是空閒的

普通方法和同步方法或同步**塊的區別

同步方法或者同步**塊需要執行它們的執行緒獲得相應的鎖(類鎖或者物件鎖)之後才能執行,否則會阻塞在該處直到獲得相應的鎖。而普通方法,一旦呼叫就會立即執行,與當前執行緒是否獲得同步鎖沒有關係。

如果某段**f需要獲得類a的物件a1的物件鎖才能執行,某段**g需要獲得類a的物件a2的物件鎖才能知行,問當執行緒1在執行f時,同時執行的執行緒2的g是否會阻塞?

答案是不會阻塞。因為執行緒1在執行f時只獲得了a1的物件鎖,a2的物件鎖依然是空閒的,所以執行緒2在執行g時可以立馬獲得a2的物件鎖

多執行緒同步 synchronize

在專案中我們經常遇到這樣一種情況 兩個人同時運算元據庫,導致資料異常。針對於資料庫級別我們採用鎖機制,還有一種方法使規定我們方法呼叫的許可權,當你在使用這個資源的時候別人是不允許使用的,在多執行緒中只需要乙個修飾詞就可以實現 synchronize。第一步 下面我們採用銀行取錢的場景來 實現 acc...

Java 多執行緒同步 synchronized

在多執行緒程式設計環境下,對於共享資源 比如多執行緒共享的變數 的寫操作時,不同執行緒之間假如沒有相互同步,而是隨機讀取 更改變數回寫到記憶體中,就會出現混亂和錯誤!因此必須要在多執行緒的操作方法上新增鎖物件,當乙個執行緒進入操作的時候,其它執行緒必須要等待,這樣依次序列完成任務。synchroni...

多執行緒 Synchronize實現原理

前言 synchronize實現實現同步最常用的方式,但是它的底層實現呢?如何實現 通過synchronize修飾的 塊,執行緒訪問需要申請鎖才能訪問,但是當乙個物件的鎖已經被乙個執行緒拿到了,其他執行緒就拿不到這個物件的鎖,必須進入等待阻塞的狀態。monitor物件,在同步 塊的開始會引入moni...