据我所知,我们在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]);
}
}
}
}现在在上面的例子中,当我在同步语句( synchronized (arr) )中使用"arr“对象时,我得到了一致的预期输出,如下所示。
线程-0 1
线程-1 1
线程-1 2
但是当我在同步语句( synchronized (lock))中使用"lock“对象时,我得到的输出如下所示。
线程-1%0
线程-0 2
线程-1 2
这两种情况下的输出不应该是相同的吗?
谢谢,
香塔努斯
发布于 2012-11-18 17:20:35
锁本质上是静态,所以两个线程共享相同的arr,如果arr Object是instance object,它将在两个线程中有两个不同的实例。
所以当你在这里与arr对象同步时,任何第一个进入持有arr object锁的块的线程,将完成它的执行,其他线程将等待第一个线程完成或释放锁。
在锁对象的情况下,它是完成两个不同的对象(两个资源),所以每个线程持有不同资源或对象的锁,所以执行将是并行的。
https://stackoverflow.com/questions/13438873
复制相似问题