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


 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對象。

這就是互相等待。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM