在Java中处理同步块/方法中的异常的最佳实践

时间:2014-06-26 20:55:46

标签: java multithreading synchronization

我已经读过在编写同步块或方法时必须小心,因为如果一个线程由于异常而退出同步方法/块,则同步锁被释放,因为内存模型不关心线程是否因异常而退出因此,即使对象可能处于损坏状态,同步锁也可用于其他线程的抓取。

因此,如果我们考虑最佳实践,是否有任何指导我们可以遵循编写同步方法/块。我个人认为锁是非常好的,因为他们的try {} finally {}语义,但如果我们有一个需要绝对拥有同步方法/块的API,那么编码这些同步方法/块的好方法是什么。我认为对同步方法采用try finally方法可能会很好,但是StringBuffer类不使用该方法。我不确定任何具有同步方法的标准类是否使用该方法。那么应该将记录部分留给uncaughtExceptionHandler作为出路吗?

还有其他可以派上用场的好方法吗?如果对象的状态被破坏,有没有办法阻止其他线程获取同步锁。 UncaughtExceptionHandlers和finally块最多可以执行其他日志记录。那是对的吗?它们无法阻止其他线程随后获取同步锁。那是对的吗?那么我们应该如何在Java中编写同步的方法/块?

1 个答案:

答案 0 :(得分:1)

关键部分(例如,“synchronized blocks”)可能对应用程序的性能非常不利。了解阿姆达尔定律。每当你开始写“同步”时,你应该问自己,“我可以重新设计以消除这种需要吗?”†如果答案是否定的,那么你的下一个问题应该是,“我怎样才能让它像可能吗?“

如果synchronized块中的代码可以抛出异常,那么它可能不会尽可能小。找到一种在不触及全局状态的情况下执行异常抛出的方法,然后只有在异常抛出的东西产生有效结果时才输入synchronized块来修改状态。

如果听起来我要求你写一个做额外工作的程序,那是因为我要求你写一个做额外工作的程序。 Amdahl定律的信息是,为了从多处理器机器获得最佳性能,我们经常不得不在单处理器机器上做一些不太理想的事情。

多处理已经存在了一段时间,但多处理架构的广泛部署是新的。当“多处理器”意味着“超级计算机”时,人们仍在使用书写的书。但突然之间,我们有了四核和八核的笔记本电脑,甚至手机也有多核。

是时候停止以旧方式做事了。


†java.util.concurrent类是你的朋友。