[英]Does the class lock have the same effect if I use a static variable in this class as a lock in Java?
例子:
class A {
public static Integer age;
}
// Approach 1:
class Exe1 {
public void exec() {
synchronized(A.class) {
//do something
}
}
}
// Approach 2
public class Exec2 {
public void exec() {
synchronized(A.age) {
//do something
}
}
}
方法 2 中的代碼的行為方式是否與方法 1 相同?
我的意思是,這兩種方法在控制代碼執行順序方面是否具有相同的效果?
不,不是的。
synchronize(A.class)
塊由A
類的Class<A>
實例控制,該實例始終存在並且始終是同一個實例1 。 所以Exe1.exec()
的每次執行都被同一個實例鎖定/同步。
然而synchronize(A.age)
塊由當前位於靜態字段A.age
中的當前實例控制。 可以通過為A.age
分配不同的實例來更改它,例如A.age = Integer.valueOf(42);
. 之后, Exe2.exec()
的每次執行都由該Integer
對象控制,獨立於其他當前鎖定的Exe2.exec()
執行。 此外, A.age
可以為null
,這意味着當您遇到synchronize(null) {...}
時會出現異常。
1 ) JLS 不要求.class
表達式(參見15.8.2. 類文字)總是返回相同的實例,參見JLS - 12.2。 類和接口的加載:
行為良好的類加載器維護以下屬性:
- 給定相同的名稱,一個好的類加載器應該總是返回相同的類對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.