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

标签 java multithreading synchronization

根据我的理解,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/

相关文章:

java - 如何修复“File.exists()”错误的 boolean 返回值?

java - 如何以函数式方式生成具有复杂条件的对象?

c# - Thread.Sleep(300) 无法正常工作

c++ - Linux:如何测量进程内线程的内存使用情况?

c - 如何从等待条件变量/信号量的线程池中唤醒线程?

node.js - 环回 : Embedded Model is not working in offline sync

spring - Vaadin不同步时不调用getSystemMessages

java - Mockito 监视具有内部方法引用的类

java - 通过回车键提交方法?

c++ - Windows std::thread 是否在内部使用 PPL?