[英]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.