gpt4 book ai didi

java - java中synchronized(expr){}中expr的意义

转载 作者:行者123 更新时间:2023-12-03 12:56:27 25 4
gpt4 key购买 nike

根据我的理解,我们在java中使用“同步语句”来阻止多线程之间的干扰。

现在我试图理解 expr 在以下表达式中的重要性。

同步(表达式){
声明
}

因为看起来锁定行为取决于 expr 对象。

例如

public class Sync extends Thread {
static int [] arr = {0,1,2};
Object lock = new Object();
public static void main(String[] args){

Sync ob1 = new Sync();
Sync ob2 = new Sync();
ob1.start();
ob2.start();

}
@Override
public void run() {
synchronized (arr) {
for(int i = 0;i < arr.length; ++i){
try {

Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " " + arr[i]);

}
}

}
}

现在在上面的例子中,当我在同步语句(同步(arr))中使用“arr”对象时,我得到一致的预期输出如下。
线程 0 0
线程 0 1
线程 0 2
线程 1 0
线程 1 1
线程 1 2

但是当我在同步语句(同步(锁定))中使用“锁定”对象时,我得到如下输出。

线程 0 0
线程 1 0
线程 0 1
线程 1 1
线程 0 2
线程 1 2

两种情况下的输出不应该相同。

谢谢,
尚塔努

最佳答案

arr Object本质上是静态的,所以两个线程共享相同的 arr,以防锁是 instance object它将在两个线程中有两个不同的实例。

因此,当您在此处与 arr 对象同步时,首先进入持有 arr object 锁的块的任何线程。并且将完成其执行,其他将等待直到第一个线程完成或释放锁。

在锁对象的情况下,它是完整的两个不同的对象(两个资源),因此每个线程持有不同资源或对象的锁,因此执行将是并行的。

关于java - java中synchronized(expr){}中expr的意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13438873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com