Public Class A
{
private Object memberlockObject = new Object();
public doStuffapproach1(){
synchronized(this){
// Do something;
}
}
public doStuffapproach2(){
synchronized(memberlockObject){
// Do something;
}
}
public doStuffapproach3(Object parameterLockObject){
synchronized(parameterLockObject){
// Do something;
}
}
}
在上面的代码中,doStuffapproach1、doStuffapproach2、doStuffapproach3方法是否实现了相同类型的 block 同步。 如果不是,它们有何不同。 分别在什么场景下使用?
P.S:我知道方法级同步与在(this)上同步整个方法体一样好。
最佳答案
当你使用synchronized关键字时,你需要定义一个对象来用作监视器。
synchronized(this)
使用当前对象作为监视器
synchronized(otherObject)
使用另一个对象作为监视器
如果您需要在不同类中的同一对象上进行同步,那么至少其中一个类需要在与 this
不同的对象上进行同步。
请注意,将方法隐式定义为同步
将在this
上同步(如果该方法不是静态
)。
doStuffapproach1
方法对此进行同步,因此同一对象上对该方法的任何调用都会同步。
doStuffapproach2
的工作方式与 doStuffapproach1
完全相同,因为您锁定的对象在当前对象中具有唯一的实例。
doStuffapproach3
的工作方式有所不同,因为您传递监视器并取决于您作为参数传递的内容。
关于java - 同步(this)和同步(其他对象)之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37805284/