【问题标题】:What is the use of "private final Object" locking in java multithreading?java多线程中“私有最终对象”锁定的用途是什么?
【发布时间】:2013-10-25 12:41:28
【问题描述】:

java多线程中“private final Object”锁定有什么用?

就我的理解而言,我认为要使一个类成为线程安全的,我们应该使用内在锁定,我们将所有方法标记为同步并使用“this”将它们锁定在对象的监视器上?或者我们可以用方法中的私有最终对象锁替换类的“this”上标记为同步的方法,以锁定通用对象锁以使其线程安全?

仅以使用内部锁定的代码为例:

public class Counter{

 // Locks on the object's monitor
 public synchronized void changeValue() { 
   // ...
 }

}

我们可以将上面的代码替换成如下的外在锁:

public class Counter{
 private final Object lock = new Object(); // private final lock object

  public void changeValue() {
   synchronized (lock) { // Locks on the private Object
  // ...
       }
  }
}

是否建议使用上述外部锁定而不是使用内部锁定使类成为线程安全的?如果我的理解有误,请纠正我?

【问题讨论】:

  • 这只是使对类的访问同步 - 这与线程安全不同。 (除非每个公共方法都实现一个逻辑“事务”。)

标签: java multithreading


【解决方案1】:

Oracle Secure coding standard 包含您需要的所有信息。

基本上它是为了防止这种情况:声明为同步的方法和在 this 引用上同步的块都使用对象的监视器(即它的内在锁)。攻击者可以通过获取并无限期持有可访问类的内在锁来操纵系统触发争用和死锁,从而导致拒绝服务 (DoS)。

【讨论】:

  • 当两个不同的级别无意中为不同的事情使用相同的锁时,它还避免了意外拒绝服务或过度粗粒度的锁定。
  • 嗨,henrik,我通过了帖子感谢您的链接。如果不使用上述任何一种方法来创建线程安全类,是否使用客户端锁定仍然不清楚。
  • 这种DoS攻击有例子吗?
【解决方案2】:

下面的例子清除了何时使用,

public class Foo {
    // Locks on the object's monitor
    public synchronized void changeValue() {
        // ...
    }
    public static Foo changeState(String name) {
        // Manipulate on Foo 
        return obj;
    }
    public static void main(String[] args) throws InterruptedException {
        // Untrusted code
        String name = "test" ;
        Foo foo = Foo.changeState(name);
        if (foo == null) {
            throw new IllegalStateException();
        }
        synchronized (foo) {
            while (true) {
                // Indefinitely lock someObject
                Thread.sleep(Integer.MAX_VALUE);
            }
        }
    }
}

【讨论】:

    【解决方案3】:

    This rule 解决了要在同步块中使用的监视器对象的类型。 总结文章,推荐使用外在锁(称为private lock object idiom)。

    1. 对无法更改的对象实例进行锁定可使同步更加一致。当同步对象无法更改时,很难中断同步。
    2. 由于锁定在特定对象上,因此即使线程正在同步块上工作,其他类资源也可用。这使代码更健壮,更不易发生死锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多