2

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

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

同步(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

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

谢谢,
山塔努

4

1 回答 1

3

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

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

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

于 2012-11-18T09:20:35.293 回答