use*_*414 78 java thread-safety
如果synchronized方法调用另一个synchronized方法,它是否是线程安全的?
void synchronized method1() {
method2()
}
void synchronized method2() {
}
Run Code Online (Sandbox Code Playgroud)
pic*_*ypg 99
是的,当你将方法标记为synchronized
,那么你真的这样做:
void method1() {
synchronized (this) {
method2()
}
}
void method2() {
synchronized (this) {
}
}
Run Code Online (Sandbox Code Playgroud)
当线程调用从method1进入method2时,它将确保它保持锁定this
,它已经存在,然后它可以通过.
当线程直接进入method1或method2时,它将阻塞直到它可以获得lock(this
),然后它将进入.
正如James Black在评论中所指出的那样,你必须要了解你在方法体内所做的事情.
private final List<T> data = new ArrayList<T>();
public synchronized void method1() {
for (T item : data) {
// ..
}
}
public void method3() {
data.clear();
}
Run Code Online (Sandbox Code Playgroud)
突然之间,它不是线程安全的,因为你正在寻找ConcurrentModificationException
未来,因为它method3
是不同步的,因此可以在线程B工作时由线程A调用method1
.
是一个标有同步调用方法的另一个同步方法线程安全.
一般来说,不可能说.这取决于方法的作用,以及相同和其他类的其他方法.
但是,我们可以确保不同线程对同一对象的method1和method2的调用不会同时执行.根据方法的作用,这可能足以说该类对于这些方法是线程安全的.