获取同步块上另一个对象的锁定

时间:2013-12-02 12:39:06

标签: java multithreading synchronization

我目前正在彻底研究多线程概念,我注意到每当讨论synchronized block时,就会获得this对象的锁定。 e.g:

synchronized(this) {}

但是,有没有理由将另一个对象作为同步的参数?或者这是一个不可取的模式?

4 个答案:

答案 0 :(得分:1)

您可以使用如下公共对象。

static final Object lock=new Object();

然后你可以将它解析为synchronized块,如下所示

synchronized(lock){

 }

这里只要求你必须共享共同的对象。然后基于此对象锁定每个路径(不同的对象)。

我认为你对我们使用其他对象的原因有疑问。

如果我们想通过不同的线程锁定不同的路径,我们必须锁定每个路径。所以我们必须使用第三个对象。然后,当一个对象查询该锁定对象时,其他线程必须等待该锁重新密封。但是获得锁的同一个线程可以继续。

答案 1 :(得分:1)

您可以使用第三方对象作为锁定。通常,可以使用来实现这些对象与不同对象之间的共享资源的同步,在执行某段代码之前,将强制获取此第三方对象锁。

答案 2 :(得分:1)

锁定其他内容的一个例子可能是有益的:

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)会锁定两个调用,即使没有必要。

Btw:并发列表将使所有这些同步过时

答案 3 :(得分:0)

synchronized(this) {}

这意味着在this上同步的任何其他线程必须释放/等待,直到您释放/等待锁定才能继续进行。

  synchronized(somethingElse) {}

这意味着现在使用somethingElse进行锁定。

所以有明显的区别,取决于你的同步。