我在一个类中有一个同步方法和一个非同步方法,并且我有一个线程在同步方法上获得锁。
我的问题是:在这种情况下,其他线程可以访问类的非同步方法吗?
我在一个类中有一个同步方法和一个非同步方法,并且我有一个线程在同步方法上获得锁。
我的问题是:在这种情况下,其他线程可以访问类的非同步方法吗?
是的。如果未声明该方法,其他线程仍可访问该方法synchronized
是的,其他线程可以访问非同步方法,但请记住其他线程无法访问您的其他同步方法,因为每个对象而不是每个方法只有一个锁。
同步方法只是使用当前实例作为监视器(锁)的同步块的语法快捷方式:
public synchronized void abc() {
//something to do
}
相当于
public void abc() {
synchronized(this) {
//something to do
}
}
要运行同步块,线程必须首先获取相应的监视器,在这种情况下this
,这保证了不能超过一个线程可以同时运行该块。
现在,this
用作监视器的事实并不能保证同步块之外的任何内容。换句话说,如果您的对象包含非同步方法,它们可以由多个线程同时运行,因为它们不需要正在运行的线程获取this
监视器。