Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问非同步';同步时类的d方法';d方法已锁定_Java_Multithreading_Synchronized - Fatal编程技术网

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
    }
}