使用synchronized块

时间:2011-08-21 12:02:52

标签: java synchronized

在method1和method2中使用synchronized块有什么区别或影响?

class A
{
  private Object lock = new Object();
  ...
  ...

  private void method1()
  {
    synchronized(A.class)
    {
      .....
    }
  }


  private void method2()
  {
    synchronized(lock)
    {
      ....
    }
  }

}

5 个答案:

答案 0 :(得分:7)

在第一种方法中,所有使用A类实例的线程都将同步。

在第二种方法中,所有使用A类实例的线程都将同步。

答案 1 :(得分:3)

由于A.class可供其他人使用,因此它是公开的。如果其他东西使用它来同步对某些代码段的访问,则可能会阻止您的代码段。这可能是好事也可能是坏事;但你无法控制它。

使用内部对象可以将其视为私有对象,以便您可以完全控制使用的位置和时间。我更喜欢使用我控制的内部对象。

答案 2 :(得分:1)

Lock是一个普通的领域。因此,每个'A'实例都有一个。 A.class是整个JVM的全局。所以这两个块具有完全不同的语义。带有'lock'的版本说''对于此实例,只有一个线程可以在此块中。带有A.class的版本说'对于A的任何实例,只有一个线程可以在此块中。

答案 3 :(得分:1)

在第一种情况下,您在公共对象(A.class)上进行同步,因此应用程序的其他部分可能会导致问题,因为它们也会在A.class上同步。

在第二种情况下,您在私有锁对象上进行同步,因此确保没有其他人使用该锁来同步对其他内容的访问。

此外,正如其他答案所示,该类的所有实例将与第一个解决方案在同一个锁上同步,而每个实例将与第二个解决方案拥有自己的锁。

因此第二种解决方案更受欢迎(尽管锁定对象应该是最终的)。

答案 4 :(得分:1)

需要同步块的参数才能创建多个“命名”块。因此,使用特殊锁定对象可能更灵活:您可以在将来创建lock1和lock2。

另一个方面是等待和通知。你可以从另一个帖子说lock.wait()然后lock.notfify()。在这种情况下,您还可以使用两种方式(特殊锁定对象或A.class作为锁定)。