我可以调用一个同步方法调用一个调用同步方法的非同步方法吗?

Can I call a synchronized method that calls a non-synchronized method that calls a synchronized method?

在 Java 中,在单个对象和线程中全部使用同步关键字。

我可以调用一个同步方法调用一个调用同步方法的非同步方法,而没有最终同步方法阻塞第一个同步方法完成吗?

单对象单线程没问题。

你的唯一线程能够获得所有的锁,并且由于重入,它可以多次获得它们。

即使我们添加另一个线程,它也会工作(对一个对象)。一个线程将获取第一个锁,阻塞第二个线程,然后继续正常执行。

多线程多对象,答案是"it depends on how the code is written"。

如果一个class既有同步方法也有非同步方法,多个 线程仍然可以访问您拥有的 class 的非同步 methods.If 不访问您要保护的数据的方法,那么您就不会 需要同步它们。同步在某些情况下会导致命中(或 如果使用不当甚至死锁)

无论同步与否,您的代码始终可以调用方法。一个更好的问题是,当你的代码调用它时会发生什么。

同步方法如下所示:

synchronized void foobar() {
    doSomething();
}

实际上只是一种简写方式:

void foobar() {
    synchronized(this) {
        doSomething();
    }
}

所以关于调用同步方法的任何问题实际上都是关于执行同步的问题。当您的代码输入 synchronized(this) {...}.

时,可能会发生三件事

1) 如果this对象没有加锁,那么它会被加锁在调用线程的名字中,线程会执行块中的语句,然后当它解锁的时候完成了。

2) 如果 this 对象已经被调用线程锁定,那么线程将简单地执行块中的语句。

3) 如果this对象被某个other线程锁定,那么调用线程会一直等到另一个线程解锁它,然后再继续与情况 (1) 一样。

如果您的代码试图锁定两个 不同的 锁,唯一会惹上麻烦的方法。然后,如果您的设计没有经过深思熟虑,两个或更多线程可能会 死锁,您可以在其他地方阅读相关内容。