1. 程式人生 > >多線程訪問同步方法的7種情況(面試常考)

多線程訪問同步方法的7種情況(面試常考)

mage 分享圖片 影響 bsp 鎖對象 有一種 技術分享 線程安全 同時

1.

2.

3

4.同時訪問同步方法和非同步方法

synchronized只作用於用它修飾的方法,沒有加synchronized 的方法不會受到影響,

技術分享圖片

技術分享圖片

如圖可以看出加了synchronized修飾符的方法和沒有加的方法是同步執行的,也就是說互不影響

5.同時訪問一個類的普通同步方法

對於同一個實例來說,他們拿到了同一把鎖,沒辦法同時運行,而是串行

*雖然synchronized沒有指明用那一把鎖,但是其背後原理已經指明他們用了同一把鎖,因為他們用了同一把鎖*

技術分享圖片

技術分享圖片

同一個實例

技術分享圖片

6.同時訪問靜態synchronize方法和非靜態synchronized方法

因為它們兩個拿到了不同的鎖,所以是並行執行的,

技術分享圖片

技術分享圖片

7.方法拋出異常後,會釋放鎖

方法拋出異常後,會釋放鎖,一旦拋出異常後,第二個線程會立刻進入同步方法,意味著鎖已經釋放

個人認為還有一種:同時訪問多個靜態synchronize方法

這種形式他們拿到的只是同一把鎖,所以不能並行執行,所以要按照順序一個線程執行完再到另外一個線程

技術分享圖片

技術分享圖片

          總結

1.一把鎖只能同時被一個線程獲取,沒有拿到鎖的必須等待

2,每個實例都有自己對應的一把鎖,不同實例之間互不影響,例外:(鎖對象是*.class以及synchronized修飾的是static方法的時候,所有對象共同擁有一把鎖)

3.無論是方法正常執行完畢或者是方法拋出異常,都會釋放鎖,

4,在一個被synchronized修飾的方法裏面調用了一個沒有被synchronized修飾的方法線程安全嗎?

  答案是不安全,因為synchronized只對修飾本生的方法起作用,對其他方法不起作用。

多線程訪問同步方法的7種情況(面試常考)