聊聊synchronized的鎖問題
本文不會特別深入細緻地討論synchronized,只是做一個通俗易懂的說明,以及看清一類問題的本質,希望能給大家一點啟發。
問題描述
有一個類A,提供了三個方法。分別是靜態同步方法,非靜態同步方法,含有靜態代碼塊的方法
1 class A{
2 public static synchronized void print1{
3 print;
4 }
5 public synchronized void print2{
6 print;
7 }
8 public void print3{
9 synchronized (new Object){
10 print;
11 }
12 }
13 private static void print{
14 while(true){
15 String threadName = Thread.currentThread.getName;
16 System.out.println(threadName);
17 }
18 }
19 }
請回答一下四種情況的輸出結果
1 class Test {
2 // 1.兩個線程,同一個類,調用靜態同步方法print1
3 @Test
4 public void test1 {
5 Thread thread1 = new Thread( -> A.print1);
6 Thread thread2 = new Thread( -> A.print1);
7 thread1.start;
8 thread2.start;
9 }
10 // 2.兩個線程,同一個對象,調用非靜態同步方法print2
11 @Test
12 public void test2 {
13 A a = new A;
14 Thread thread1 = new Thread( -> a.print2);
15 Thread thread2 = new Thread( -> a.print2);
16 thread1.start;
17 thread2.start;
18 }
19 // 3.兩個線程,不同對象,調用非靜態同步方法print2
20 @Test
21 public void test3 {
22 Thread thread1 = new Thread( -> new A.print2);
23 Thread thread2 = new Thread( -> new A.print2);
24 thread1.start;
25 thread2.start;
26 }
27 // 4.兩個線程,同一個對象,調用普通非靜態方法(帶有同步代碼塊)print3
28 @Test
29 public void test4 {
30 A a = new A;
31 Thread thread1 = new Thread( -> a.print3);
32 Thread thread2 = new Thread( -> a.print3);
33 thread1.start;
34 thread2.start;
35 }
36 }
問題答案
先直接報上答案:
- 一直輸出「Thread-1」
- 一直輸出「Thread-1」
- 交替輸出「Thread-1」和「Thread-2」
- 交替輸出「Thread-1」和「Thread-2」
問題本質分析
不廢話,直接點出,這四個問題只要明白兩件事即可:
- 一個線程是否能執行被同步了的方法,主要看是否能拿到鎖對象
- 靜態方法的同步鎖是
類對象
本身,非靜態方法的同步鎖是實例對象
本身,同步代碼塊的同步鎖是括弧中傳入的對象
所以
- 如果兩個線程執行方法用到了同一個鎖對象,則一個線程執行時,另一個線程必須等待其釋放鎖才能拿到鎖,所以此時兩個線程會互斥
所以
- 1中兩個線程執行方法的鎖對象都是
類對象A
,所以線程之間互斥 - 2中兩個線程執行方法的鎖對象都是
實例對象a
,所以線程之間互斥 - 3中兩個線程執行方法的鎖對象分別是
new出來的兩個
實例對象a,所以線程互不影響 - 4中兩個線程執行方法的鎖對象分別是
new出來的兩個
實例對象object,所以線程互不影響
Game Over


TAG:科技優家 |
※聊聊hikari與tomcat jdbc pool的fail fast
※在 adidas Originals Arkyn Party 上,我們聊聊了「女性平權」和「潮流文化」
※看了木村拓哉 x 竇靖童的廣告嗎?來聊聊Levi』s Vintage Clothing
※聊聊英國的Quaker school
※和 Geoffery Hinton 面對面聊聊
※For daugthers:這一天想和Mom聊聊關於美麗的秘密
※聊聊Cloud Foundry開源PaaS雲平台
※鞋先生和您聊聊 Nike Air Jordan 1 的進化歷史
※今天聊聊Teacher』spet這個話題
※Turbo Charger!聊聊快充技術
※特別篇/聊聊ChinaJoy
※由淺入深聊聊SAP Cloud Platform
※在Blazer Mid發售前,聊聊sacai是如何通吃時裝與街頭的
※真的是為了交朋友 聊聊Nokia 8 Sirocco旗艦機
※獨家專訪Levi s現任品牌歷史官Tracey Panek,聊聊時尚圈的復古回潮
※聊聊 WWDC19 的一項重大發布:「Sign in with Apple」
※聊聊FromSoftware繼黑魂後新作《只狼》與《Deracine》的最新預告
※Apple Store 入華十年,聊聊你與 Ta 的故事
※聊聊美國職業選擇和規劃career path
※【Luxury Rebel 】時尚博主SherrySS醬上線 | 來聊聊出席婚禮的鞋履怎麼選