如果我从一个同步方法中调用一个非同步方法,那么这个非同步方法是线程安全的吗?

8

如果我从我的同步方法内部调用非同步方法,它是线程安全的吗?

我有以下两种方法:

public class MyClass{

 void synchronized doSomething1(){

   doSomething2();
  }

void doSomething2(){
 //will this block of code be synchronized if called only from doSomething1??
 }

}
3个回答

13
如果doSomething2()只从doSomething1()中调用,则它仅针对MyClass的单个实例被单个线程调用。它仍然可能被不同的线程同时调用,通过不同的实例 - 因此,如果它作用于任何可能不特定于MyClass实例的共享数据,仍不能保证解决所有线程问题。
基本上,您需要仔细考虑由多个线程使用的任何可变共享状态 - 如果您需要可变共享状态,则没有简单的解决方法。在您的特定情况下,您还需要确保doSomething2()仅从doSomething1()中调用 - 这意味着首先将其设置为私有...

3
当调用doSomething1()时,调用者的Thread锁定MyClass类实例的监视器。直到该线程的执行退出doSomething1为止,锁定将保持不变,包括进入doSomething2的情况。这将导致其他线程在尝试锁定时被阻塞。
请注意:synchronized不能使线程安全。
更多信息:

1
如果 doSomething2() 只从 doSomething1() 调用,那么它是线程安全的。

如果 doSomething2() 只从单个线程的 doSomething1() 中调用,那么是的。 - datalost
@Froyo:为什么是-1?在你看来,它何时不再是线程安全的?如果doSomething1()的主体是代码中唯一调用doSomething2()的地方,则在单个VM上只能运行一个线程执行doSomething1(),因此只有一个线程运行doSomething2()。 - Michał Šrajer
@Froyo:如果只有一个线程,那么根本不需要使用synchronized - Michał Šrajer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接