【问题标题】:Why Private Lock [duplicate]为什么选择私人锁 [重复]
【发布时间】:2014-08-05 20:10:36
【问题描述】:

在Java Concurrency in practice book 中,我在第4章遇到了一段代码

public Class PrivateLock{

    private final Object myLock=new Object();

    Widget widget;

    void someMethod()
    { 
        synchronized(myLock)
        {
            // Access or modify the state of widget
        }
    }
}

这本书说使用私有锁对象有很多好处。将锁对象设为私有会封装锁,以便客户端代码无法获取它,而可公开访问的锁允许客户端代码正确或错误地参与其同步策略。

我的怀疑是

  1. 如果我有自己的Runnable方法,我调用实例化这个类并调用someMethod(),会不会获取锁失败?

  2. 如果是这样,代码的所有者如何利用这个锁并调用someMethod()?因为他还要实例化这个类的一个对象,调用someMethod(),同样的我,客户端也在做。

我怀疑这是重复的,但我没有在这些线程中找到我的答案。

【问题讨论】:

    标签: java multithreading locking


    【解决方案1】:

    1)如果我有自己的 Runnable 方法,我调用实例化这个类并调用 someMethod() ,会不会获取锁失败?

    不,除非锁已经被另一个线程在别处获得,例如如果有另一个线程具有您的 PrivateLock 对象引用,它在您之前调用了 someMethod,并且仍在执行使用锁的那部分方法。

    当书上说客户端无法获取它时,可能意味着客户端无法获取对锁的引用来锁定他们自己的客户端代码中的东西,并不意味着客户端调用者无法执行同步块。

    拥有私有锁可以防止这种情况:

    PrivateLock myPrivateLock = new PrivateLock();
    // MyPrivateLockThread is a custom Thread class that calls myMethod
    Thread thread = new MyPrivateLockThread(myPrivateLock);
    thread.start();
    // Now the following would be possible if the lock wasn't private
    synchronized(myPrivateLock.myLock) { while (true) { } }
    

    您希望防止这种情况发生,这样您就不必担心您不拥有的客户端代码会导致您拥有的代码出现线程问题。

    【讨论】:

      【解决方案2】:

      我相信我可以看出您的困惑来自哪里:想法是有一个 PrivateLock 的实例和几个不同的线程处理该实例,同时调用 instance.someMethod()

      1)如果我有自己的 Runnable 方法并调用实例化此类 并调用 someMethod() ,会不会获取锁失败?

      答案:如果只有一个线程在实例上调用此方法,它不应该失败

      2) 如果是这样,代码的所有者如何使用这个锁? 调用一些方法()?因为他还要实例化一个对象 这个类并调用someMethod(),和我一样,客户端正在做。

      答案:我相信现在你可以自己回答了:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-10
        • 2011-09-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多