我在同步方法中调用noonsynchronized方法是否是线程安全的?
我有两种方法如下:
public class MyClass{
void synchronized doSomething1(){
doSomething2();
}
void doSomething2(){
//will this block of code be synchronized if called only from doSomething1??
}
}
答案 0 :(得分:12)
如果doSomething2()
仅从doSomething1()
调用,则只有单个线程才会为MyClass
的单个实例调用它。它仍然可以通过不同的实例同时从不同的线程调用 - 因此如果它作用于任何可能不是MyClass
实例特定的共享数据,它仍然无法保证修复所有线程问题。
基本上,您需要仔细考虑多个线程使用的任何可变共享状态 - 如果您需要可变共享状态,则没有简单的修复方法。在您的特定情况下,您还需要确保确定 doSomething2()
仅从doSomething1()
调用 - 这意味着将其设为私有以开始......
答案 1 :(得分:3)
在实例的监视器上调用{i}来电者的 doSomething1()
锁定时我是Thread
。在该线程的执行退出MyClass
之前,锁定将保留,如果它进入doSomething1
则包含。这会导致其他线程在尝试锁定时阻塞。
请记住:
doSomething2
没有线程安全。
更多信息:
答案 2 :(得分:1)
如果仅从doSomething2()
调用doSomething1()
,那么是 - 它是线程安全的。