[英]Using 'this' versus another object as lock in synchronized block with wait and notify
[英]acquiring the lock of another object on a synchronized block
我目前正在深入研究多線程概念,並且我注意到,每當討論synchronized block
時,都會獲得this
對象的鎖定。 例如:
synchronized(this) {}
但是,是否有任何理由將另一個對象作為同步的參數? 還是不明智的模式?
您可以按以下方式使用公共對象。
static final Object lock=new Object();
然后您可以將其解析為同步塊,如下所示
synchronized(lock){
}
這里唯一的要求是您必須共享公共對象。 然后,基於此對象鎖定每個路徑(不同的對象)。
我認為您對我們為什么使用其他對象有疑問。
如果要通過不同的線程鎖定不同的路徑,則必須鎖定每個路徑。 因此,我們必須使用第三個對象。 然后,當一個對象要求該鎖對象時,其他線程必須等待,直到該鎖被重新密封為止。 但是獲得鎖的相同線程可以繼續。
您可以將第三方對象用作鎖 。 通常,此類對象可用於實現對不同對象之間共享資源的同步 ,這將被迫在執行某些代碼段之前獲取此第三方對象鎖。
為什么鎖定其他內容可能會有所幫助的示例:
final List<Object1> firstList = new List<>();
final List<Object2> secondList = new List<>();
// ...
public Object readFromListOne() {
synchronized(firstList) {
return firstList.remove(0);
}
}
public Object readFromListTwo() {
synchronized(secondList) {
return secondList.remove(0);
}
}
在這里線程可以同時訪問兩個列表,而synchronized(this)
可以鎖定兩個調用,即使這不是必需的。
順便說一句:並發列表將使所有這些同步過時
synchronized(this) {}
這意味着,任何其他線程上進行同步this
將釋放/等待 ,直到你釋放/等待鎖才能進入。
synchronized(somethingElse) {}
這意味着現在可以使用somethingElse
進行鎖定。
因此,兩者之間存在明顯的差異,具體取決於您所同步的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.