理解Java中的synchronized關鍵字

理解Java中的synchronized關鍵字。

synchronized 是java中的一個關鍵字,用於多線程情況下解決線程同步問題;它可以用來修飾代碼塊,方法,還有靜態方法

  • 1)  修飾一個代碼塊:被修飾的代碼塊叫作同步代碼塊,作用範圍是{}括起來的代碼,作用對象是根據鎖對象判斷.例如:1.synchronized(this){}這樣它的作用對象是調用該方法的對象2. synchronized(Object.class){} 這樣它的作用對象是這個類的所有對象
  • 2)  修飾一個方法:被修飾的方法叫作同步方法,作用範圍是被修飾的整個方法,作用對象是調用該方法的對象
  • 3)  修飾一個靜態方法:作用範圍是被修飾的整個靜態方法,作用對象是這個類的所有對象

做幾個例題:

有如下一個類A
class 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修飾的靜態方法的作用範圍是該類的所有對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章