
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對象。
這就是互相等待。
你如果使用兩個線程去調用這兩個方法,就會死鎖。