如果我从我的synchronized方法调用非同步方法是非同步方法线程安全吗?

时间:2011-09-24 08:24:48

标签: java methods thread-safety

我在同步方法中调用noonsynchronized方法是否是线程安全的?

我有两种方法如下:

public class MyClass{

 void synchronized doSomething1(){

   doSomething2();
  }

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

}

3 个答案:

答案 0 :(得分:12)

如果doSomething2()仅从doSomething1()调用,则只有单个线程才会为MyClass 的单个实例调用它。它仍然可以通过不同的实例同时从不同的线程调用 - 因此如果它作用于任何可能不是MyClass实例特定的共享数据,它仍然无法保证修复所有线程问题。

基本上,您需要仔细考虑多个线程使用的任何可变共享状态 - 如果您需要可变共享状态,则没有简单的修复方法。在您的特定情况下,您还需要确保确定 doSomething2()仅从doSomething1()调用 - 这意味着将其设为私有以开始......

答案 1 :(得分:3)

实例的监视器上调用{i}来电者的 doSomething1() 锁定Thread。在该线程的执行退出MyClass之前,锁定将保留,如果它进入doSomething1则包含。这会导致其他线程在尝试锁定时阻塞。

请记住: doSomething2没有线程安全。

更多信息:

答案 2 :(得分:1)

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