首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中同步( expr ) {}中expr的意义

在java中同步( expr ) {}中expr的意义
EN

Stack Overflow用户
提问于 2012-11-18 17:15:42
回答 1查看 128关注 0票数 2

据我所知,我们在java中使用“同步语句”来停止多线程之间的干扰。

现在我正在尝试理解expr在下面表达式中的意义。

已同步(expr) {语句}

因为看起来锁定行为依赖于expr对象。

例如:

代码语言:javascript
复制
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

这两种情况下的输出不应该是相同的吗?

谢谢,

香塔努斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-18 17:20:35

锁本质上是静态,所以两个线程共享相同的arr,如果arr Objectinstance object,它将在两个线程中有两个不同的实例。

所以当你在这里与arr对象同步时,任何第一个进入持有arr object锁的块的线程,将完成它的执行,其他线程将等待第一个线程完成或释放锁。

在锁对象的情况下,它是完成两个不同的对象(两个资源),所以每个线程持有不同资源或对象的锁,所以执行将是并行的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13438873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档