根据我的理解,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”对象时(synchronized (arr)),我得到一致的预期输出,如下所示。
线程-0 0
线程0 1
线程-0 2
线程1 0
线程 1 1
线程 1 2
但是当我在同步语句(synchronized (lock))中使用“lock”对象时,我得到的输出如下。
线程0 0
线程1 0
线程0 1
线程 1 1
线程-0 2
线程 1 2
两种情况下的输出不应该相同吗。
谢谢,
山塔努
最佳答案
arr 对象
本质上是静态的,因此两个线程共享相同的 arr,如果锁是实例对象
,它将在两个线程中拥有两个不同的实例。
因此,当您在此处与 arr 对象同步时,任何首先进入持有 arr 对象锁的 block 的线程都将完成其执行,其他线程将等待,直到第一个线程完成或释放该对象锁定。
对于锁对象来说,它是完整的两个不同的对象(两个资源),因此每个线程持有不同资源或对象的锁,因此执行将是并行的。
关于java - java中synchronized(expr){}中expr的意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13438873/