Java 访问非同步';同步时类的d方法';d方法已锁定
我在一个类中有一个同步方法和一个非同步方法,我有一个线程在同步方法上获得锁Java 访问非同步';同步时类的d方法';d方法已锁定,java,multithreading,synchronized,Java,Multithreading,Synchronized,我在一个类中有一个同步方法和一个非同步方法,我有一个线程在同步方法上获得锁 我的问题是:在这种情况下,其他线程可以访问类的非同步方法吗?是。如果未声明该方法已同步,则其他线程仍可访问该方法。synchronized同步方法只是使用当前实例作为监视器(锁)的同步块的语法快捷方式: 相当于 public void abc() { synchronized(this) { //something to do } } 要运行同步块,线程必须首先获取相应的监视器,在本例中
我的问题是:在这种情况下,其他线程可以访问类的非同步方法吗?是。如果未声明该方法已同步,则其他线程仍可访问该方法。
synchronized
同步方法只是使用当前实例作为监视器(锁)的同步块的语法快捷方式:
相当于
public void abc() {
synchronized(this) {
//something to do
}
}
要运行同步块,线程必须首先获取相应的监视器,在本例中为this
,这保证了不能有多个线程同时运行块
现在,
此
用作监视器的事实并不保证同步块之外的任何内容。换句话说,如果您的对象包含非同步方法,则它们可以由多个线程并发运行,因为它们不需要运行的线程获取此监视器。是的,其他线程可以访问非同步方法,但请记住其他线程不能访问您的其他同步方法,因为每个对象只有一个锁,而不是每个方法。但是某些线程已经在该对象上设置了锁。。那么其他线程如何可能进入该锁定对象呢?否,它使用该锁访问该方法。如果任何其他线程尝试重用同一个锁,它会被卡住并等待另一个锁完成,但您说过如果该方法未声明为已同步,则其他线程仍可访问该方法?是,如果你没有指定一个方法synchronized
,那么另一个线程将不会阻塞,并且可以访问该方法。虽然我们锁定了该类,但其他线程可以访问正常的方法,对吗?只有必须持有锁的代码一次只能运行一个线程。可以在没有锁的情况下运行的代码,无论对象是否被锁定都可以运行。
public void abc() {
synchronized(this) {
//something to do
}
}