假设我有一个代码片段,其中我想在链接列表中插入一个节点,并且为了我在编码机制之后使用的一致性:假设当前和下一个是LinkedList的元素,其中current表示我们正在处理的Object,下一个代表列表的下一个对象。
synchronized(current) {
synchronized(next) {
.............
}
}
我为当前的Object执行了insertafter。可以通过同步方法实现相同的功能。因为我们只能在一个对象上获得锁定。所以同步插入后不会阻止某人使用insertBefore。
答案 0 :(得分:1)
众所周知,这种模式会产生所谓的deadly embrace
。想象一下,其他人正在使用您的代码并且也相当于insertBefore
:
synchronized(next) {
synchronized(current) {
.............
}
}
这显然会以泪水结束。
显而易见的答案不是在节点上同步,而是在节点之间的连接上进行同步。
答案 1 :(得分:1)
同步方法只不过是synchronized(this) {...}
的语法糖。
因此,对您的问题的字面答案是“不容易”。您将需要两个不同的对象,其中声明了两个同步方法,并从另一个调用一个。但这似乎是一个坏主意。
一般来说,我质疑尝试将显式同步块减少为同步方法的目标。同步块更具可读性,如果某些其他代码由于某种原因决定使用与锁相同的实例,则允许您封装锁对象以防止意外的锁争用。
另外,你确定你需要那种你试图做的细粒度锁定吗?这似乎容易出错...一个更简单的代码会在列表上的任何操作的同一对象上同步。