1

我对线程同步有些困惑。考虑我有两个线程Thread1Thread2以及两个同步的方法 foo1()foo2()。foo1() 是同步方法而 foo2() 不是,在 foo1 内部有一条语句调用 foo2() 并且如果 Thread1 调用 foo1() 并且它正在 foo2() 方法中工作,同时 Thread2 想要直接访问不同步的 foo2() 方法。

所以我的问题是 Thread2 会获得 Foo2() 的访问权限吗?或者它会等待 Thread1 完成它的任务?

4

4 回答 4

4

如果foo2()未同步,则任何线程都可以随时调用它而不会被阻塞。线程是否从另一个本身同步的方法调用它没有任何区别。

于 2012-04-27T09:06:02.290 回答
3

锁定的是对象,而不是方法。这意味着如果它们正在访问不同的对象,您可以在 foo1() 中拥有两个线程。如果他们访问的是同一个对象,同一个锁会阻止并发访问,不管什么先调用或什么调用。

顺便说一句: foo1() 可以调用自己,因为它已经拥有锁。

于 2012-04-27T09:10:58.973 回答
1

Thread2 不会被阻塞也不会等待。它将开始执行 Foo2,因为它没有同步。

于 2012-04-27T09:06:55.437 回答
0

Thread2 可以直接调用 foo2(),因为 foo2() 不是同步方法,所以任何线程都可以调用它而不获取当前对象的监视器。</p>

于 2012-04-27T09:27:33.227 回答