当前位置: 首页 > 面试题库 >

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

袁法
2023-03-14
问题内容

如果一个同步方法调用另一个同步方法,那么线程安全吗?

void synchronized method1() {
     method2()
}

void synchronized method2() {
}

问题答案:

是的,将方法标记为时synchronized,您实际上是在这样做:

void method1() {
    synchronized (this) {
        method2()
    }
}

void method2() {
    synchronized (this) {
    }
}

当线程调用从method1进入method2时,它将确保它持有对的锁定this,该锁定已经存在,然后可以通过。

当线程直接进入method1或method2时,它将阻塞直到获得锁(this),然后进入。

正如詹姆斯·布莱克(James Black)在评论中指出的那样,您必须了解方法主体内部的操作。

private final List<T> data = new ArrayList<T>();

public synchronized void method1() {
    for (T item : data) {
        // ..
    }
}

public void method3() {
    data.clear();
}

突然,它不是线程安全的,因为ConcurrentModificationException您将来会因为method3不同步而在看a
,因此可以在线程B工作时由线程A调用method1



 类似资料:
  • 我正试图从同步方法运行异步方法。但是我不能等待异步方法,因为我在同步方法中。我一定不理解TPL,因为这是我第一次使用它。 每个方法都需要前一个方法来完成,因为第一个方法的数据用于第二个方法。 Await运算符只能在异步方法中使用。考虑用'async'修饰符标记此方法,并将其返回类型更改为'task' 但是,如果我使用async修饰符,这将是一个异步操作。因此,如果我对的调用没有使用await运算符

  • 为什么下面的代码不能保证多个线程之间total_home数字的唯一性,即使逻辑处于同步块中。 } } } 这是一个程序示例。试着运行5-10次,你会发现total_home的值并不是每次都是唯一的。

  • 假设我们有两个类A、B和各自类的同步方法methodA、methodB。如果我们从synchronizedmethodA调用synchronized methodB,那么当methodB仍在执行时,线程是否仍对ObjectA保持锁定?

  • 同步调用异步方法最安全的方法是什么?

  • 问题内容: 我使用的是Spring 4,我注意到了一个奇怪的行为……如果我从普通实例方法多次调用异步方法,那么它们都将在不同的线程中调用,并在随机时间完成。但是,如果我多次从另一个异步方法中调用一个异步方法,那么它们将按顺序完成。我有这样的事情: 我正在使用默认的异步执行器。我应该换一个吗?但是,该执行程序不会重用任何线程,而是每次都启动另一个线程,因此应该没问题……这仅仅是巧合吗?但是我尝试了十