我目前正在彻底研究多线程概念,我注意到每当讨论synchronized block
时,就会获得this
对象的锁定。 e.g:
synchronized(this) {}
但是,有没有理由将另一个对象作为同步的参数?或者这是一个不可取的模式?
答案 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
进行锁定。
所以有明显的区别,取决于你的同步。