synchronized(this)和synchronized(其他一些对象)之间有什么区别

时间:2016-06-14 07:12:08

标签: java multithreading synchronization thread-safety

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)上同步整个方法体一样好。

1 个答案:

答案 0 :(得分:2)

使用synchronized关键字时,需要定义要用作监视器的对象。

synchronized(this)使用当前对象作为监视器

synchronized(otherObject)使用另一个对象作为监视器

如果您需要在不同类中的同一对象上进行同步,则至少其中一个需要在与this不同的内容上进行同步。

请注意,将synchronized隐式定义方法将在this上同步(如果方法不是static)。

doStuffapproach1方法对此进行同步,因此对同一对象上的该方法的任何调用都是同步的。

doStuffapproach2doStuffapproach1完全相同,因为您锁定了当前对象中具有唯一实例的对象。

doStuffapproach3的工作方式不同,因为您通过了监视器并依赖于您传递的参数。