synchronized 修飾普通方法、靜態方法、程式碼塊時的差異
阿新 • • 發佈:2018-11-09
目標 : 理解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修飾的程式碼塊 使用的鎖是物件鎖。