理解Java中的synchronized關鍵字。
synchronized 是java中的一個關鍵字,用於多線程情況下解決線程同步問題;它可以用來修飾代碼塊,方法,還有靜態方法
- 1) 修飾一個代碼塊:被修飾的代碼塊叫作同步代碼塊,作用範圍是{}括起來的代碼,作用對象是根據鎖對象判斷.例如:1.synchronized(this){}這樣它的作用對象是調用該方法的對象2. synchronized(Object.class){} 這樣它的作用對象是這個類的所有對象
- 2) 修飾一個方法:被修飾的方法叫作同步方法,作用範圍是被修飾的整個方法,作用對象是調用該方法的對象
- 3) 修飾一個靜態方法:作用範圍是被修飾的整個靜態方法,作用對象是這個類的所有對象
做幾個例題:
有如下一個類Aclass A {
public synchronized void a() {
}
public synchronized void b() {
}
}
然後創建兩個對象
A a1 = new A();
A a2 = new A();
然後在兩個線程中併發訪問如下代碼:
Thread1 Thread2
a1.a(); a2.a();
請問二者能否構成線程同步?
這種情況是不構成同步的,上面有說到synchronized修飾的方法的作用範圍是調用該方法的對象,這裏顯然是兩個對象他們會調用各自的同步方法,不能同步
如果A的定義是下面這種呢?class A {
public static synchronized void a() {
}
public static synchronized void b() {
}
}
- 這種情況就構成了同步,因爲synchronized修飾的靜態方法的作用範圍是該類的所有對象