从另一个同步方法调用同步方法是否安全?

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.


Ste*_*n C 6

是一个标有同步调用方法的另一个同步方法线程安全.

一般来说,不可能说.这取决于方法的作用,以及相同和其他类的其他方法.

但是,我们可以确保不同线程对同一对象的method1和method2的调用不会同时执行.根据方法的作用,这可能足以说该类对于这些方法是线程安全的.