线程安全同步块

时间:2012-04-27 09:03:42

标签: java thread-safety

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

所以我的问题是 Thread2会访问Foo2()吗?还是会等待Thread1完成它的任务?

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

BTW:foo1()可以调用自己,因为它已经锁定了。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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