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
expr在java中synchronized(expr){}中的意义_Java_Multithreading_Synchronization - Fatal编程技术网

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

expr在java中synchronized(expr){}中的意义,java,multithreading,synchronization,Java,Multithreading,Synchronization,据我所知,我们在java中使用“synchronized statement”来阻止多线程之间的干扰。 现在我试图理解expr在以下表达式中的意义。 已同步(expr){ 声明 } 因为看起来锁定行为取决于expr对象 e、 g 公共类同步扩展线程{ 静态int[]arr={0,1,2}; 对象锁=新对象(); 公共静态void main(字符串[]args){ Sync ob1=新同步(); Sync ob2=新同步(); ob1.start(); ob2.start(); } @凌驾 公开募

据我所知,我们在java中使用“synchronized statement”来阻止多线程之间的干扰。

现在我试图理解expr在以下表达式中的意义。

已同步(expr){ 声明 }

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

e、 g

公共类同步扩展线程{
静态int[]arr={0,1,2};
对象锁=新对象();
公共静态void main(字符串[]args){
Sync ob1=新同步();
Sync ob2=新同步();
ob1.start();
ob2.start();
}
@凌驾
公开募捐{
同步(arr){
对于(int i=0;i
现在在上面的示例中,当我在synchronized语句(synchronized(arr))中使用“arr”对象时,我得到了如下一致的预期输出
线程-0 0
线程-01
线程-0 2
线程-10
线程1
线程1 2

但当我在synchronized语句(synchronized(lock))中使用“lock”对象时,得到的输出如下

线程-0 0
线程-10
线程-01
线程1
线程-0 2
螺纹-12

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

谢谢,

Shantanu

arr对象
本质上是静态的,因此两个线程共享相同的arr,如果lock是
实例对象
,它将在两个线程中有两个不同的实例

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

对于lock对象,它是两个不同的对象(两个资源),因此每个线程持有不同资源或对象的锁,因此执行将是并行的

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]);

            }
        }

    }
}