在实践书中的Java并发性中,我在第4章中遇到了一段代码。
public Class PrivateLock{
private final Object myLock=new Object();
Widget widget;
void someMethod()
{
synchronized(myLock)
{
// Access or modify the state of widget
}
}
}这本书说使用私有锁对象是有好处的。使锁对象私有封装锁,使客户端代码无法获得锁,而可公开访问的锁允许客户端代码参与其同步策略--正确或错误。
我的怀疑是
someMethod(),那么它会无法获得锁吗?someMethod()?因为他还必须实例化这个类的一个对象并调用someMethod(),与客户机所做的相同。我怀疑这是重复的,但我没有在这些线索中找到我的答案。
发布于 2014-08-05 20:16:37
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) { } }您想要防止这种情况,所以您不需要担心您没有自己的客户端代码,这会导致您所拥有的代码出现线程问题。
发布于 2014-08-05 20:16:35
我相信我可以看到您的困惑之处:想法是让PrivateLock的一个实例和几个不同的线程使用该实例,同时调用instance.someMethod()。
1)如果我有自己的Runnable方法,并调用实例化这个类并调用someMethod(),那么它会不能获得锁吗?
应答:如果只有一个线程在实例上调用此方法,则不会失败
2)如果是这样的话,代码的所有者如何利用这个锁并调用someMethod()?因为他还必须实例化这个类的一个对象并调用someMethod(),与客户机所做的相同。
回答:我相信现在你可以自己回答了:)
https://stackoverflow.com/questions/25147446
复制相似问题