1. 程式人生 > >synchronized 修飾普通方法、靜態方法、程式碼塊時的差異

synchronized 修飾普通方法、靜態方法、程式碼塊時的差異

目標 : 理解synchronized的含義、明確synchronized關鍵字修飾普通方法、靜態方法和程式碼塊時鎖物件的差異。

synchronized

Java中的關鍵字,用來實現多執行緒下的同步機制,避免多個執行緒的資源訪問造成的混亂。

java中每個物件內部都有一個鎖,如果一個方法使用 synchronized關鍵字修飾,java便會把這個方法保護起來。

在其中一個執行緒釋放鎖之前,別的執行緒在呼叫該同步方法時,會被阻塞。

synchronized修飾普通方法

synchronized修飾普通方法時,使用的鎖是物件的鎖。

下面是一個示例:

class A {
    public
synchronized void a() { } public synchronized void b() { } } 然後建立兩個物件 A a1 = new A(); A a2 = new A(); 然後在兩個執行緒中併發訪問如下程式碼: Thread1 Thread2 a1.a(); a2.a();

不能保證同步。

原因:

上面我們建立了兩個物件,分別是 a1,a2,他們是兩個物件,也是就 他們各自有各自的鎖, 所以不能保證同步。

synchronized修飾靜態方法

synchronized修飾靜態方法時,使用的鎖是類物件的鎖,Class。

如果A的定義是下面這種呢?
class A {
    public static synchronized void a() {
    }
    public static synchronized void b() {
    }
}

可以保證同步

原因:
對於static 修飾的方法,它的鎖是類物件Xxx.class 即我們呼叫方法時 都是

A.a()

由於使用的是同一個鎖。
執行緒1Thread1 呼叫時,執行緒2Thread2 會被阻塞。 所以可以保證同步

synchronized修飾同步程式碼塊

每個Java物件都有一個鎖,執行緒可以通過進入同步方法獲得一個鎖,還有另外一種機制,即進入同步方法塊獲得鎖。

synchronized修飾的程式碼塊 使用的鎖是物件鎖