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

Java 获取同步块上另一个对象的锁,java,multithreading,synchronization,Java,Multithreading,Synchronization,我目前正在深入研究多线程概念,我注意到每当讨论同步块时,就会获得对这个对象的锁定。e、 g: synchronized(this) {} 但是,是否有任何理由将另一个对象作为synchronized的参数?还是一种不可取的模式 您可以使用一个公共对象,如下所示 static final Object lock=new Object(); 然后您可以将其解析为同步块,如下所示 synchronized(lock){ } 这里唯一的要求是您必须共享公共对象。然后每个路径(不同的对象)基于此

我目前正在深入研究多线程概念,我注意到每当讨论
同步块
时,就会获得对
这个
对象的锁定。e、 g:

synchronized(this) {}

但是,是否有任何理由将另一个对象作为synchronized的参数?还是一种不可取的模式

您可以使用一个公共对象,如下所示

static final Object lock=new Object();
然后您可以将其解析为同步块,如下所示

synchronized(lock){

 }
这里唯一的要求是您必须共享公共对象。然后每个路径(不同的对象)基于此对象锁定

我想你对我们为什么使用其他对象有疑问


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

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

synchronized(this) {}
这意味着在
上同步此
的任何其他线程必须释放/等待,直到释放/等待锁才能继续

  synchronized(somethingElse) {}
这意味着现在使用
somethingElse
锁定


因此,有一个明显的区别,这取决于同步的对象。

锁定其他对象可能有益的示例:

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);
  }
}
final List firstList=new List();
最终列表secondList=新列表();
// ...
公共对象readFromListOne(){
已同步(第一个列表){
返回第一个列表。删除(0);
}
}
公共对象readFromListTwo(){
已同步(第二个列表){
返回第二个列表。删除(0);
}
}
在这里,线程可以同时访问两个列表,而
synchronized(this)
将锁定两个调用,即使这不是必需的


顺便说一句:并发列表将使所有这些同步都过时

我理解将对象作为参数传递的含义。问题是它是否实用。@Tom为误解感到抱歉,是的。它是。也可以使用/传递其他对象。这很常见。