据我了解,我们在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
两种情况下的输出不应该相同。
谢谢,
山塔努