3

我在一个类中有一个同步方法和一个非同步方法,并且我有一个线程在同步方法上获得锁。

我的问题是:在这种情况下,其他线程可以访问类的非同步方法吗?

4

3 回答 3

4

是的。如果未声明该方法,其他线程仍可访问该方法synchronized

于 2012-06-24T11:36:56.493 回答
2

是的,其他线程可以访问非同步方法,但请记住其他线程无法访问您的其他同步方法,因为每个对象而不是每个方法只有一个锁。

于 2012-06-24T13:09:51.813 回答
1

同步方法只是使用当前实例作为监视器(锁)的同步块的语法快捷方式:

public synchronized void abc() {
    //something to do
}

相当于

public void abc() {
    synchronized(this) {
        //something to do
    }
}

要运行同步块,线程必须首先获取相应的监视器,在这种情况下this,这保证了不能超过一个线程可以同时运行该块。

现在,this用作监视器的事实并不能保证同步块之外的任何内容。换句话说,如果您的对象包含非同步方法,它们可以由多个线程同时运行,因为它们不需要正在运行的线程获取this监视器。

于 2012-06-24T12:04:50.700 回答