synchronized之類鎖和例項鎖

2021-09-01 19:09:25 字數 1475 閱讀 2229

synchronized可以修飾**塊和方法,方法又分為靜態方法和普通方法,那麼一言概之:執行緒執行的時候當有synchronized時,他獲取的是類鎖或例項鎖然後才能執行。

**準備:

構造四類同步方法:

public synchronized void a()  catch (interruptedexception e) 

}public synchronized void b()

public static synchronized void c() catch (interruptedexception e)

}public static synchronized void d()

通過sleep來實現操作差

案例1:如果某一物件有多個同步方法,那麼其只能排隊訪問其對應的同步方法,因為此時是物件鎖

public static void testinstance1() 

}, "t1").start();

new thread(new runnable()

}, "t2").start();

}

輸出:

a然後開始等待,方法a執行完之後輸出b

案例2:多個例項,訪問各自不同的同步方法時不受影響:

public static void testinstance2() 

}, "t1").start();

new thread(new runnable()

}, "t2").start();

}

輸出:ab

方法a未執行結束

案例3:當同步訪問靜態方法和非靜態方法時不受影響,因為他們是兩個不同的鎖,靜態方法是類鎖而非靜態方法為例項鎖:

public static void testinstance3() 

}, "t1").start();

new thread(new runnable()

}, "t2").start();

}

輸出:

astatic c

而a方法未執行結束,例項鎖未釋放

案例4:當併發訪問兩個非靜態方法是需要同步等待:

public static void testinstance4() 

}, "t2").start();

new thread(new runnable()

}, "t1").start();

}

輸出:

static c

等c執行完成之後釋放了類鎖之後輸出static d

結論:

1.靜態方法鎖的是類,而非靜態方法鎖的是當前的例項,兩把不同的鎖互不影響;

2.類鎖只有一把,而不同的例項其鎖不同;

3.靜態**塊效果等同;

執行緒鎖 synchronized

使用 synchronized解決執行緒同步問題相比較nslock要簡單一些,日常開發中也更推薦使用此方法。首先選擇乙個物件作為同步物件 一般使用self 然後將 加鎖 爭奪資源的讀取 修改 放到 塊中。synchronized中的 執行時先檢查同步物件是否被另乙個執行緒占用,如果占用該執行緒就會處...

執行緒之 鎖 synchronized鎖

多執行緒中有寫程式是由一寫bug的,學習執行緒鎖,很經典的例子,買票案例 有a,b,c三個視窗,同時售賣100張票,最後可能會出現賣了重複的票,或者多賣了,賣超了等執行緒不安全問題 看乙個執行緒不安全的賣票 小明,小張,小王同時去買票,就會出現上面的執行緒不安全問題,因為,視窗1賣了1張票,而另外兩...

synchronized內建鎖詳解

synchronized內建鎖詳解 多執行緒訪問同一共享可變資源的情況下,會出現執行緒不安全問題,經典案例購買火車票 public class testthread2 public void getticket system.out.println thread.currentthread getn...