允许方法在Java中锁定其父对象
在Java中有没有办法获得一个方法来锁定(互斥)它所在的对象?
我知道这听起来令人困惑,但基本上我对这个C#片段并不公平,但在Java中。
lock(this) { // Some code here... }
我的任务是将用.Net编写的API重新实现到Java中,并且我被要求保持Java版本尽可能与.Net版本类似。 事实上,.Net版本看起来像是从我无法访问的C ++版本转录而来的。
无论如何,上面的行出现在C#版本中,我需要在Java中做同样的事情。
相当于:
synchronized (this) { }
(不,你通常不应该在C#或Java中这样做。更喜欢锁定没有其他任何东西可以访问的私人引用。当然你可能已经知道了 – 但我不想留下答案没有警告:)
假设C ++代码是一个简单的互斥锁,将“lock”替换为“synchronized”
synchronized (this) { // ... }
以下是Java Concurrency教程以获取更多信息
我推荐Brian Goetz的“ Java Concurrency In Practice” 。 这是一本很好的书。
保持同步块尽可能小是一件好事。 在方法上使用synchronized修饰符是粗粒度的,有时是必要的,但是否则你可以使用另一个对象来保持块更小。
喜欢这个:
public class PrivateLock { private final Object myLock = new Object(); @GuardedBy("myLock") Widget widget; void someMethod() { synchronized (myLock) { // Access or modify the state of widget } } }
您还应该查看API(JDK 5.0+)的java.util.concurrent包以获取其他并发管理对象,例如信号量,交换机等。
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html