为什么私人锁

时间:2014-08-05 20:10:37

标签: java multithreading locking

在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(),客户端正在做同样的事情。

  3. 我怀疑这是重复的,但我没有在这些帖子中找到答案。

2 个答案:

答案 0 :(得分:2)

  

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) { } }

您希望阻止这种情况,因此您不必担心您不拥有的客户端代码会导致您拥有的代码出现线程问题。

答案 1 :(得分:1)

我相信我可以看到你的困惑来自哪里:我的想法是让PrivateLock的实例和一些不同的线程使用该实例,同时调用instance.someMethod()

  

1)如果我有自己的Runnable方法,我调用实例化这个类   并调用someMethod(),它是否无法获取锁?

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

  

2)如果是这样,代码的所有者如何使用此锁和   调用someMethod()?因为他还必须实例化一个对象   这个类并调用someMethod(),客户端正在做同样的事情。

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