我对线程同步有些困惑。考虑我有两个线程Thread1和Thread2以及两个同步的方法 foo1()和foo2()。foo1() 是同步方法而 foo2() 不是,在 foo1 内部有一条语句调用 foo2() 并且如果 Thread1 调用 foo1() 并且它正在 foo2() 方法中工作,同时 Thread2 想要直接访问不同步的 foo2() 方法。
所以我的问题是 Thread2 会获得 Foo2() 的访问权限吗?或者它会等待 Thread1 完成它的任务?
我对线程同步有些困惑。考虑我有两个线程Thread1和Thread2以及两个同步的方法 foo1()和foo2()。foo1() 是同步方法而 foo2() 不是,在 foo1 内部有一条语句调用 foo2() 并且如果 Thread1 调用 foo1() 并且它正在 foo2() 方法中工作,同时 Thread2 想要直接访问不同步的 foo2() 方法。
所以我的问题是 Thread2 会获得 Foo2() 的访问权限吗?或者它会等待 Thread1 完成它的任务?
如果foo2()
未同步,则任何线程都可以随时调用它而不会被阻塞。线程是否从另一个本身同步的方法调用它没有任何区别。
锁定的是对象,而不是方法。这意味着如果它们正在访问不同的对象,您可以在 foo1() 中拥有两个线程。如果他们访问的是同一个对象,同一个锁会阻止并发访问,不管什么先调用或什么调用。
顺便说一句: foo1() 可以调用自己,因为它已经拥有锁。
Thread2 不会被阻塞也不会等待。它将开始执行 Foo2,因为它没有同步。
Thread2 可以直接调用 foo2(),因为 foo2() 不是同步方法,所以任何线程都可以调用它而不获取当前对象的监视器。</p>