【问题标题】:What effect does the monitor object have in synchronized block?监控对象在同步块中有什么作用?
【发布时间】:2014-04-18 18:54:00
【问题描述】:

经过几个小时的阅读,我仍然难以理解监视器对象的确切作用。

演示我的意思:

public class Demo {

    public static Bathroom bathroom = new Bathroom();

    public static Kitchen kitchen = new Kitchen();

    public static void main(String[] args) {
        (new Thread(new Roommate("bob"))).start();
        (new Thread(new Roommate("john"))).start();
        (new Thread(new Mom())).start();
    }
}

class Bathroom {
    public void use(String who) {
        synchronized (Demo.kitchen) {
            System.out.println(who + " is using bathroom");
            Long time = System.currentTimeMillis();
            while (System.currentTimeMillis() - time < 2000) {
                continue;
            }
            System.out.println(who + " unlocked bathroom");
        }
    }
}

class Kitchen {
    synchronized public void use(String who) {
        System.out.println(who + " is using kitchen");
    }
}

class Roommate implements Runnable {
    private String name;
    public Roommate (String name) { this.name = name; }
    @Override
    public void run() {
        Demo.bathroom.use(name);
    }   
}

class Mom implements Runnable {
    @Override
    public void run() {
        Demo.kitchen.use("mom");
    }   
}

我将“Demo.kitchen”放在浴室同步块的括号中。如果有人在使用浴室,那么浴室和厨房都被锁定。为什么它们都被锁定了?

我猜:

1) 监视器对象本身(在我的例子中是厨房)被所有线程锁定(在同步块中使用时)

2) 如果它们都具有相同的监视器对象(在我的情况下,两个室友的浴室与监视器对象相同),则一次只允许一个线程执行同步块

这是正确的想法还是我错过了什么?

Marko Topolnik,谢谢你的回答。

我想我明白现在发生了什么。

第一个线程 1 (bob) 开始使用浴室并锁定厨房(因为提供了 Demo.kitchen)。 当 john 也想使用浴室时,他不能,不是因为浴室被锁定,而是因为他正在检查厨房是否被锁定(鲍勃刚刚锁定它)。 而且妈妈不能使用厨房,因为那是实际上被锁定的物体。

【问题讨论】:

标签: java synchronization thread-safety locking synchronized-block


【解决方案1】:

注意不要将监视器与它们所属的对象混淆。通常,在考虑监视器和锁时,最好完全忘记“对象”方面。

特别是,声明某段代码的类与获取的锁无关。当您在Bathroom 的方法中锁定Demo.kitchen 时,只有kitchen 对象被锁定。此外,锁定 Demo.kitchen 不会阻止其他代码同时访问和更改 kitchen 对象,除非该代码也受到同一个锁的保护。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 2013-06-12
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    相关资源
    最近更新 更多