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