2011-04-13 100 views
2

这是相关的,但绝对不一样的,这个著名的SO问题:同步(这)和观察员通知

Avoid synchronized(this) in Java?

很多时候,我有一个“观察的主题”,喜欢它的通知观察员在修改时。该通知主要在做的“外国人法”调用(因为他们在有效的Java等正在调用)我也有这样的事情:

public void updateData(params) { 
    synchronized (this) { 
     // do some computation here 
    } 
    notifyObservers(); // Never, EVER, call an alien method with a lock held (see Effective Java) 
} 

public synchronized Result getResult() { 
    ... 
} 

我应该避免synchronized(this),因此也去掉​​从getResult()方法?

这是下面的人反对synchronized(this)建议的建议:

private final Object lock = new Object(); // shiny lock 

public void updateDate(params) { 
    synchronized(lock) { 
     ... 
    } 
    notifyObservers(); 
} 

public Result getResult() { 
    synchronized(lock) { 
     return Result; 
    } 
} 

至于奖金问题,不保证它自己的SO问题:如果要推荐后者,有什么做谁建议不要使用人synchronized(this)想想Java中的方法可以声明为“synchronized”的事实吗?

+0

请注意,如果在此观察者/通知情况下首选使用私人锁定,那么将代码切换到“私人锁定”成语绝对不会有问题:) – SyntaxT3rr0r 2011-04-13 12:34:22

回答

1

如果你担心公开你的锁,你不想让它成为你的API的一部分,或者你有一个更细粒度的锁定策略和一个锁是不够的,你可以使用私人锁如你所述。

但请注意,还有另一种更灵活的选择:ReentrantLock。您提到的问题中没有提及的固有锁的一个缺点是它们只支持不间断锁获取。另一方面,ReentrantLock提供了用于检查锁定状态,超时可中断采集和采集的方法。写取消任务时,因为其跟随general prescription用于阻断方法抛出InterruptedException到信号线的中断在阻塞操作

可中断采集是特别有用的。基于中断的取消机制之后是Executorsjava.util.concurrent