簡體   English   中英

如果我在這個類中使用靜態變量作為Java中的鎖,類鎖是否具有相同的效果?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM