繁体   English   中英

同步方法可以满足同步块可以实现的所有目的吗?

[英]Can synchronized methods serve all purposes which a synchronized block can?

假设我有一个代码片段,要在其中插入节点,并且为了保持一致性,我使用以下编码机制:假设current和next是LinkedList的元素,其中current表示我们正在处理的对象,next表示下一个对象列表。

synchronized(current) {
     synchronized(next) {
              .............
     }
}

我为当前对象执行了一个insertafter。 可以通过同步方法实现相同的功能。 由于我们只能获得单个对象的锁。 因此同步的insertAfter不会阻止某人使用insertBefore。

众所周知,这种模式会导致所谓的deadly embrace 想象其他人在使用您的代码,并且也做了相当于insertBefore

synchronized(next) {
     synchronized(current) {
              .............
     }
}

这显然会以眼泪结束。

显而易见的答案不是在节点上同步,而是在节点之间的联接上同步。

同步方法不过是synchronized(this) {...}语法糖。

因此,对您的问题的字面上答案是“不容易”。 您将需要两个声明两个同步方法的对象,并从另一个对象中调用一个。 但这似乎是一个坏主意。

通常,我对尝试将显式同步块简化为同步方法的目标提出质疑。 同步块更具可读性,并且如果某些其他代码出于某种原因决定使用与锁相同的实例,则可以封装锁对象以防止意外的锁争用。

另外,您确定您需要尝试的那种细粒度锁定吗? 这似乎容易出错。。。对于列表上的任何操作,更简单的代码将在同一对象上同步。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM