簡體   English   中英

帶有私有不可變對象的同步塊和同步方法的區別

[英]Synchronized block with private immutable object and synchronize method difference

private final Object lockObject = new Object();
public void getCount() {
    synchronized( lockObject ) {
        ...
    }
}

為什么上面的代碼比下面的代碼更好:

public void synchronized getCount() {
      ...
}

我搜索並找到了如下所述的解釋。

將其放在方法上意味着您正在使用對象本身的鎖來提供線程安全。 通過這種機制,惡意代碼用戶也可能獲得對象上的鎖,並將其永久持有,從而有效地阻塞了其他線程。 非惡意用戶可以無意中有效地執行相同的操作。

但是我無法完全理解這一點。 惡意用戶如何永久持有鎖? 任何人都可以用示例代碼進行解釋,以證明上述情況是正確的嗎?

public class Example {
    public void synchronized getCount() {
            ...
    }
}

它正在當前對象上同步this 其他類能夠獲取當前對象的引用並將其用作監視器鎖定:

public class OtherClass {

    public void otherMethod() {
        Example example = new Example();
        synchronized (example) {
            ...
        }
    }
}

這可能會得到意外的結果,例如,導致在執行otherMethod時阻塞了getCount

在第一種方法中,由於監視器鎖lockObject是私有的,因此其他類無法直接訪問它,因此它比第二種方法更可取。

簡而言之-

在方法級別使用鎖定時,您將獲得已同步方法的完整類對象的鎖定。

假設是否有任何用戶帶有一些閃亮的代碼來執行方法直到Universe結束..這將導致其他線程因使用類中的其他方法而被阻塞。

這是首選監視對象和同步塊的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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