首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要上锁

为什么要上锁
EN

Stack Overflow用户
提问于 2014-08-05 20:10:36
回答 2查看 862关注 0票数 2

在实践书中的Java并发性中,我在第4章中遇到了一段代码。

代码语言:javascript
复制
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(),与客户机所做的相同。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-05 20:16:37

1)如果我有自己的Runnable方法,并调用实例化这个类并调用someMethod(),那么它会不能获得锁吗?

不是,除非锁已经由另一个线程在其他地方获得,例如如果在您之前有另一个具有PrivateLock对象引用的线程称为someMethod,并且仍然在执行使用该锁的方法的那一部分。

当书中说客户端不能获得它时,它可能意味着客户端不能获得对锁的引用来锁定自己的客户端代码,这并不意味着客户端调用不能执行同步块。

使用锁私有可以防止这种情况发生:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-08-05 20:16:35

我相信我可以看到您的困惑之处:想法是让PrivateLock的一个实例和几个不同的线程使用该实例,同时调用instance.someMethod()

1)如果我有自己的Runnable方法,并调用实例化这个类并调用someMethod(),那么它会不能获得锁吗?

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

2)如果是这样的话,代码的所有者如何利用这个锁并调用someMethod()?因为他还必须实例化这个类的一个对象并调用someMethod(),与客户机所做的相同。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25147446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档