簡體   English   中英

獲取另一個對象在同步塊上的鎖

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

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