3.4 有必要尽可能避免对this加一个悲观锁吗? | Java Debug 笔记

88 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接> 提问:有必要尽可能避免对this加一个悲观锁吗?

每当有人问有关Java同步的问题时,有些人就会非常想指出synchronized(this)应该避免的事情。他们声称,有效替代上述方案的是,最好是为私有引用加一个锁。

他们会给出如下原因:

首先:会有一些恶意的代码去窃取你的锁(这种方式非常流行,当然也有一些基于此方法的变体)

其次,同一类中的所有同步方法都使用完全相同的锁,这会降低吞吐量。

最后,这会让你暴露过多不必要的信息。

包括我在内的其他人则认为,synchronized(this)是一个惯用范例(在Java库中也是如此),这是安全且易于理解的。如果这个代码在多线程环境中造成了你的代码出现了错误,那你可以避免使用他,但你没必要因噎废食,如果使用起来没什么问题,就使用它。

回答1:

我接下来依次对你的问题进行回答:

首先:会有一些恶意的代码去窃取你的锁(这种方式非常流行,当然也有一些基于此方法的变体)

相比恶意代码,我更担心意外,很可能会出现,this作为你的类公开接口的一部分,被其他类“滥用”。

同一类中的所有同步方法都使用完全相同的锁,这会降低吞吐量

仅仅摆脱synchronized(this)将无法解决问题。正确同步吞吐量需要更多的考虑。

这会让你暴露过多不必要的信息

详情请看我对问题1的回答