如果我从我的同步方法内部调用非同步方法,它是线程安全的吗?
我有以下两种方法:
public class MyClass{
void synchronized doSomething1(){
doSomething2();
}
void doSomething2(){
//will this block of code be synchronized if called only from doSomething1??
}
}
如果我从我的同步方法内部调用非同步方法,它是线程安全的吗?
我有以下两种方法:
public class MyClass{
void synchronized doSomething1(){
doSomething2();
}
void doSomething2(){
//will this block of code be synchronized if called only from doSomething1??
}
}
doSomething2()
只从doSomething1()
中调用,则它仅针对MyClass
的单个实例被单个线程调用。它仍然可能被不同的线程同时调用,通过不同的实例 - 因此,如果它作用于任何可能不特定于MyClass
实例的共享数据,仍不能保证解决所有线程问题。doSomething2()
仅从doSomething1()
中调用 - 这意味着首先将其设置为私有...doSomething1()
时,调用者的Thread
会锁定MyClass
类实例的监视器。直到该线程的执行退出doSomething1
为止,锁定将保持不变,包括进入doSomething2
的情况。这将导致其他线程在尝试锁定时被阻塞。synchronized
不能使线程安全。doSomething2()
只从 doSomething1()
调用,那么它是线程安全的。
doSomething2()
的地方,则在单个VM上只能运行一个线程执行doSomething1(),因此只有一个线程运行doSomething2()。 - Michał Šrajersynchronized
。 - Michał Šrajer