监控和锁定说明

时间:2015-11-19 13:24:44

标签: java multithreading synchronization locking monitor

我抓住了同步的概念,如下所示:Java中的每个对象都有一个监视器和一个锁。 Lock是一个可以由线程获取或释放的实体,而monitor是一个实例的机制,它决定一个线程是否可以锁定一个对象。

我想澄清以下示例。 首先,我想创建两个对象:

class Holm : ModelBase
{
    public Holm(String Name, TestSensor sensor1, TestSensor sensor2)
    {
        Sensor1 = sensor1;
        Sensor2 = sensor2;
        this.Name = Name;

        Sensor1.PropertyChanged += OnSensorOnlineChanged;
        Sensor2.PropertyChanged += OnSensorOnlineChanged;
    }

    private void OnSensorOnlineChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "IsOnline")
        {
            OnPropertyChanged(nameof(IsOnline));
        }
    }
}

每个实例都有自己的监视器和锁吗?还是共享的?

如果我在课堂上同步:

  MyClass obj1 = new MyClass();
  MyClass obj2 = new MyClass();

它会如何表现?这个同步块会获取obj1和obj2吗?如果是这样,Java中是否存在任何锁定层次结构?

跟进:说出"对象监视器"的正确方法是什么?或"对象的锁定"?

2 个答案:

答案 0 :(得分:2)

  

Java中的每个对象都有一个监视器一个锁。

听起来不对。每个对象都有一个锁。有些人称锁是监视器"。监视器是一个过去的想法,从来没有获得太大的牵引力,但回到Java创建时,实施者认为监视器将成为下一个大事。基本上,监视器是一个对象,其方法都是synchronized

  

每个实例都有自己的...锁定吗?

  

如果我在课堂上同步......它会如何表现?

一个类是一个对象。

您的示例中有三个不同的对象; obj1obj2MyClass.class。这些对象中的每一个都有自己的锁,它们的锁根本不会相互影响。

答案 1 :(得分:0)

  

如果我在课堂上同步......它会如何表现?这个同步块会获取obj1和obj2吗?

如果您在MyClass.class上进行同步,则只会与MyClass.class上的其他同步尝试同步。因此锁定obj1obj2将无效。

  

如果是这样,Java中是否有任何锁定层次结构?

不,Java中没有锁定层次结构。

  

这是说"对象监视器"的正确方法。或"对象的锁定"?

通常人们只会参考"对象的锁定"在谈论同步时。当您开始使用wait()notify()时,监控器会发挥作用,但这是一个不同的主题。