Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.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

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 如果在实例方法中放置静态锁,会发生什么?_Java_Multithreading - Fatal编程技术网

Java 如果在实例方法中放置静态锁,会发生什么?

Java 如果在实例方法中放置静态锁,会发生什么?,java,multithreading,Java,Multithreading,我是线程新手,目前正在学习线程同步章节。关于线程锁定中的一个场景,我有一个问题 以下是我所知道的: 1:当我在实例方法中放置实例锁时,即 private Object lock1= new Object(); private Object lock2 = new Object(); void f1(){ synchronized (lock1) { } } void f2(){ synchronized (lock2 ) { } } void f4(){

我是线程新手,目前正在学习线程同步章节。关于线程锁定中的一个场景,我有一个问题

以下是我所知道的:

1:当我在实例方法中放置实例锁时,即

private Object lock1= new Object();
private Object lock2 = new Object();
void f1(){
    synchronized (lock1) {

    }
}
void f2(){
    synchronized (lock2 ) {

    }
}

void f4(){
    synchronized (lock2 ) {

    }
}
void f3(){
    synchronized (lock1) {

    }
}
这里将发生的情况是,如果有一个类X的对象A被多个线程共享,并且一些线程t1正在执行f1的块,那么直到t1退出f1块,所有试图进入函数f3的其他线程,f1都将被阻止。f2和f4的情况也是如此

现在,在静态锁的情况下,如果一个类有多个静态方法,并且我们希望这些方法单独锁定,而不是类锁定,那么我们将有多个静态锁。这些锁将决定哪些方法将被阻止

到目前为止,一切都很好。现在,如果把这个静态锁放在一个实例方法中,当同一个对象上的两个线程尝试访问该方法时,会发生什么

当您在实例方法中使用静态锁进行同步时,无论对象的哪个实例正在使用,只有一个线程能够进入由该锁控制的关键部分

如果将lock1设置为静态,则即使创建了数百个类X实例,系统范围内也只有一个线程能够运行f1或f3,因为所有静态成员(包括锁定的对象)都在该类的所有实例之间共享。

在实例方法中同步静态锁时,只有一个线程能够进入由该锁控制的关键部分,而不管对象的实例在使用什么


如果将lock1设置为静态,则即使创建了数百个类X实例,系统范围内也只有一个线程能够运行f1或f3,因为所有静态成员(包括锁定的对象)都在该类的所有实例之间共享。

在并发情况下,始终将任何字段lock1、lock2设置为易变或最终。而且,如果同步锁上的代码块,无论是否同步静态上下文,一次只能执行一个线程。因此,这两个线程中的一个将被阻塞,直到另一个线程完成

在并发情况下,始终将任何字段lock1、lock2设置为volatile或final。而且,如果同步锁上的代码块,无论是否同步静态上下文,一次只能执行一个线程。因此,这两个线程中的一个将被阻塞,直到另一个线程完成

当。。。为什么不编写代码来实现这一点,运行它,看看会发生什么?静态对象是普通对象,其行为将与锁定实例对象时相同当。。。为什么不编写代码来执行此操作,运行它,看看会发生什么?静态对象是普通对象,其行为将与锁定实例对象时相同