關於Java中Synchronized互斥範圍小結

2021-08-18 23:01:06 字數 1232 閱讀 1453

synchronized的使用比較簡單,就是對**進行同步。但是昨天在看書的時候發現了乙個比較困惑的地方,就是類和例項物件之間的同步。有以下幾種情況

1.靜態方法間的同步即對類物件進行同步,執行緒對test1和test2方法的訪問是互斥的

static synchronized void test1() 

static synchronized void test2()

2.例項方法間的同步即對例項物件進行同步,執行緒對同一物件的test1和test2方法的訪問是互斥的,但是不同例項物件各自呼叫的話由於鎖住的不同的例項物件,所以test1和test2是不互斥的。

public static void main(string args) 

});pool.execute(new runnable()

});pool.shutdown();

}synchronized void test1() catch (interruptedexception e)

} synchronized void test2() catch (interruptedexception e)

}

以上都比較好理解,但是如果是下面這種情況,會怎麼樣呢?靜態方法會和例項方法互斥嗎?

public static void main(string args) 

});pool.execute(new runnable()

});pool.shutdown();

}synchronized void test1() catch (interruptedexception e)

} void test2() catch (interruptedexception e)

}//程式會同時輸出test1和test2

答案是不會的,程式會同時輸出test1和test2,我的理解是靜態方法呼叫時候鎖住的是類物件,也就是存在方法區中的那個,而例項方法呼叫時候鎖住的是例項物件本身,二者並不存在互斥關係。

所以說如果鎖住的是類物件,也就是呼叫靜態同步方法或者是synchronized(類.class)同步塊的時候,那麼有關類物件的同步呼叫就存在互斥關係,如果鎖住的是同乙個例項物件,也就是呼叫同一例項物件的同步方法或者synchronized(this)同步塊的時候,則同一例項物件的同步呼叫存在互斥關係。類物件的同步和例項物件的同步由於鎖的是不同物件,所以不存在互斥關係。

Java中關於遞迴演算法

首先演示乙個遞迴 public class testrecursion public static void main string args 乙個簡單的遞迴 乙個方法呼叫其本身方法 當然此程式執行有異常,只是說明遞迴原理 改善程式 public class testrecursion else p...

關於Java中的過載

方法的重寫 override 兩同兩小一大原則 方法名相同,引數型別相同 子類返回型別等於父類方法返回型別,子類丟擲異常小於等於父類方法丟擲異常,子類訪問許可權大於等於父類方法訪問許可權。詳細的說明為 重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫,返回值和形參都不能改變。即外殼不變,核心重...

關於JAVA中的singleton模式

package test public class singleton public static singleton getsigleton 這就是乙個單例模式,我想應該不用注釋了,原理就是這個類的構造方法private了,所有在外邊不能呼叫,也就不能new singleton 得到例項,那麼 想...