2016-03-20 88 views
3

我知道Class对象上的静态同步锁定和Object实例上的非静态锁定。线程中的静态同步和非静态同步方法行为差异

在这个问题上接受的答案

但是:Static versus non-static lock object in synchronized block

当您使用非静态锁定对象:

  • 线程1个通话o1.foo()
  • 线程2调用o1.foo(),将不得不等待线程1完成
  • 线程3调用o2.foo(),它可以继续,不在意线程1和2

为什么线程3只是继续而没有关于线程1和2.应该线程3必须等待从线程1或线程2获取对象实例'this'的锁之后才能继续?

+1

你能指定更多的问题吗?因为你提出的问题在你提供的链接中得到了回答 - 它们是不同的对象实例,所以线程3锁定了线程1和线程2中的另一个锁。 – Nier

+0

是的,我认为它们是相同的实例,因此造成了混淆。 –

回答

2

为什么线程3只继续没有关于线程1和2

因为它是锁定不同的对象。

(除非o1o2发生来指代相同的对象....)

不应该线程3必须等待以获得关于该对象实例锁定“这个”从任一线程1或2在它可以继续之前?

没有。这些呼叫分别尝试同步(即锁定)o1o2。当foo()方法调用开始时,这些将成为相应线程的this。在调用上下文中各个线程的this不相关。

相关问题