1. 程式人生 > >徹底理解線程同步與同步代碼塊synchronized

徹底理解線程同步與同步代碼塊synchronized

size 靜態方法 就是 pub open 多個 lee gif except

技術分享圖片
 1 public class Demo {
 2     public static synchronized void fun1(){
 3     }
 4     public synchronized void fun2(){
 5     }
 6     public static void main(String args[]) throws Exception{
 7         synchronized(xxx) {
 8             
 9         }
10     }
11 }
三種同步類型

雖然寫法不同,但實際上,只有一種,就是【同步代碼塊】。這是核心核心核心。同步方法也是同步代碼塊。

同步就是:一個對象同一時間只能為一個同步代碼塊服務

同步代碼塊需要傳遞的對象(鎖對象):就是鎖住這個對象,表示這個對象正在為我服務,其他人不能用(非synchronized代碼塊、方法除外)。

同步方法:就是同步代碼塊,同步鎖對象是this

同步靜態方法:就是同步代碼塊,同步鎖對象是類的class對象(Demo類裏的靜態方法鎖對象就是Demo.class)

OK了,這就是同步原理。再說簡單點當一個對象被鎖住之後,在該代碼塊之外去使用此對象的方法,只要遇到同步代碼塊,就會進入等待狀態

那什麽是死鎖?死鎖必須是多個線程對象才能夠產生的。

剛剛不是說了,一個被鎖住的對象,外部不能夠在去掉用他的synchronized方法了嗎,可如果我偏要調用,那麽就會等待,所以,死鎖就是兩個線程對象在同步代碼塊內互相調用,就會死鎖。

舉個例子:

技術分享圖片
 1 public class Demo {
 2     public static Demo a = new Demo();
 3     public static Demo b = new Demo();
 4     public void fun1(){
 5         synchronized(a) {
 6             System.out.println("fun1");
 7             try {
 8                 Thread.sleep(100);
 9             } catch (InterruptedException e) {}
10 b.fun2(); 11 } 12 } 13 public void fun2(){ 14 synchronized(b) { 15 System.out.println("fun2"); 16 try { 17 Thread.sleep(100); 18 } catch (InterruptedException e) {} 19 a.fun1(); 20 } 21 } 22 }
死鎖例子

(加等待是為了更好的說明問題)

fun1方法中,鎖住了a對象,使用b對象。

fun2方法中,鎖住了b對象,使用a對象。

這就是互相等待。

你如果使用兩個線程去調用這兩個方法,就會死鎖。

徹底理解線程同步與同步代碼塊synchronized