当前位置: 首页 > 面试题库 >

为什么在私有锁上使用私有锁?

湛同
2023-03-14
问题内容

在阅读有关同步的内容时,我遇到了“监视器模式”以封装可变状态。

以下是示例代码

   public class MonitorLock {
      private final Object myLock = new Object();
      Widget widget;
      void someMethod() {
        synchronized(myLock) {
         // Access or modify the state of widget
        }
    }

}

用私有锁代替固有锁更好吗?


问题答案:

是的-这意味着您可以看到 所有可能获得该锁的代码 (不考虑反射的可能性)。

如果您锁定this(这是我假设您通过“固有锁定”所指的),那么其他代码可以做到:

MonitorLock foo = new MonitorLock();
synchronized(foo) {
    // Do some stuff
}

该代码可能与MonitorLock自己的代码相距很远,并且可能调用其他方法,这些方法又将监视器带走。在这里很容易陷入死锁领域,因为您不容易看到要获取哪些锁。

使用“私人”锁,您可以轻松查看获得该锁的 每段代码 ,因为它们都在内MonitorLock。因此,更容易推断出该锁定。



 类似资料:
  • 问题内容: Python使我们能够在类中创建“私有”方法和变量,方法是在名称前加上双下划线,例如:。那么,如何解释这一点 这是怎么回事?! 我会为那些不太了解的人解释一下。 我在那里所做的是创建一个具有公共方法和私有方法的类,并将其实例化。 接下来,我将其称为public方法。 接下来,我尝试调用其私有方法。 这里看起来一切都很好。我们无法调用它。实际上,它是“私有”的。好吧,实际上不是。在对象上

  • Java多线程中“私有最终对象”锁定有什么用? 就我的理解而言,我认为要使一个类成为线程安全的,我们要么使用内在锁定,要么将所有方法标记为同步的 例如,使用内在锁定的代码: } 我们可以用以下外在锁替换上面的代码: 是否建议使用上述外部锁而不是使用内部锁定使类作为线程安全?如果我的理解在这里有误,请纠正我?

  • 问题内容: 我不应该能够调用实例化对象的私有方法。我想知道为什么下面的代码有效。 我知道可以从类中访问私有方法。但是,如果类中的方法实例化了同一类的对象,则作用域规则是否不适用于该实例化的对象? 如本例所示,像main这样的静态方法可以访问类的非静态成员吗​​? 问题答案: 您的方法是的方法,因此可以调用的私有方法。 只是因为它是一个方法并不妨碍它表现得像为目的的方法,等等。 只是阻止的方法 等

  • AWS VPC配置有4种场景。但让我们看看这两个: 场景1:1个公共子网。 场景2:1个公共子网和1个私有子网。 由于在公有子网中启动的任何实例都没有 EIP (除非已分配),因此它已无法从 Internet 寻址。然后: 为什么需要私有子网? 私有子网和公共子网到底有什么区别?

  • 本文向大家介绍Java类锁、对象锁、私有锁冲突测试,包括了Java类锁、对象锁、私有锁冲突测试的使用技巧和注意事项,需要的朋友参考一下 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明。 一、相关约定 为了明确后文的描述,先对本文涉及到的锁的相关定义作如下约定: 1. 类锁:在代码中的方法上加了static和synchronized的锁,或者synchronized(xxx.c

  • 为什么Java不允许在接口中使用私有成员?有什么特别的原因吗?