徹底理解線程同步與同步代碼塊synchronized
阿新 • • 發佈:2017-12-01
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