同步方法可以用于同步块的所有目的吗?

时间:2013-10-07 23:41:28

标签: java multithreading synchronization

假设我有一个代码片段,其中我想在链接列表中插入一个节点,并且为了我在编码机制之后使用的一致性:假设当前和下一个是LinkedList的元素,其中current表示我们正在处理的Object,下一个代表列表的下一个对象。

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

我为当前的Object执行了insertafter。可以通过同步方法实现相同的功能。因为我们只能在一个对象上获得锁定。所以同步插入后不会阻止某人使用insertBefore。

2 个答案:

答案 0 :(得分:1)

众所周知,这种模式会产生所谓的deadly embrace。想象一下,其他人正在使用您的代码并且也相当于insertBefore

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

这显然会以泪水结束。

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

答案 1 :(得分:1)

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

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

一般来说,我质疑尝试将显式同步块减少为同步方法的目标。同步块更具可读性,如果某些其他代码由于某种原因决定使用与锁相同的实例,则允许您封装锁对象以防止意外的锁争用。

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