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