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

时间:2015-04-30 11:20:56

标签: java multithreading synchronization java-threads

在Java中,在单个对象和线程中使用synchronized关键字。

我是否可以调用一个调用同步方法的非同步方法的synchronized方法,而不会阻止第一个同步方法完成的最终同步方法?

3 个答案:

答案 0 :(得分:5)

使用单个对象和单个线程,没有问题。

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

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

对于多个线程和多个对象,答案是“它取决于代码的编写方式”。

答案 1 :(得分:1)

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

一个看起来像这样的同步方法:

synchronized void foobar() {
    doSomething();
}

实际上只是写这篇文章的简单方法:

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

因此,关于调用synchronized方法的任何问题都是关于执行同步的问题。当您的代码输入synchronized(this) {...}时,可能会发生三件事。

1)如果this对象没有被锁定,那么它将被锁定在调用线程的名称中,线程将执行块中的语句,然后它将解锁时#&#完成了。

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

3)如果某个其他线程锁定了this对象,那么调用线程将等到另一个线程解锁它,然后它将继续进行(1) )。

您遇到麻烦的唯一方法是您的代码是否尝试锁定两个不同的锁。然后,如果您的设计没有经过深思熟虑,那么两个或多个线程可以死锁,这是您可以在其他地方阅读的内容。

答案 2 :(得分:0)

如果一个类同时具有同步和非同步方法,则为多个 线程仍然可以访问类的非同步方法。如果你有 无法访问您尝试保护的数据的方法,那么您就不会这样做 需要同步它们。在某些情况下,同步可能会导致命中(或 如果使用不正确,甚至死锁)

相关问题