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方法是否实现了相同类型的块同步。 如果不是,它们如何彼此不同。 在哪些场景中都应该使用?
P.S:我知道方法级同步与在(this)上同步整个方法体一样好。
答案 0 :(得分:2)
使用synchronized关键字时,需要定义要用作监视器的对象。
synchronized(this)
使用当前对象作为监视器
synchronized(otherObject)
使用另一个对象作为监视器
如果您需要在不同类中的同一对象上进行同步,则至少其中一个需要在与this
不同的内容上进行同步。
请注意,将synchronized
隐式定义方法将在this
上同步(如果方法不是static
)。
doStuffapproach1
方法对此进行同步,因此对同一对象上的该方法的任何调用都是同步的。
doStuffapproach2
与doStuffapproach1
完全相同,因为您锁定了当前对象中具有唯一实例的对象。
doStuffapproach3
的工作方式不同,因为您通过了监视器并依赖于您传递的参数。