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为误解感到抱歉,是的。它是。也可以使用/传递其他对象。这很常见。