Java 同步方法是否可以达到同步块可以达到的所有目的?
假设我有一个代码片段,我想在链接列表中插入一个节点,为了保持一致性,我使用了以下编码机制:假设current和next是LinkedList的元素,其中current表示我们正在处理的对象,next表示List的下一个对象Java 同步方法是否可以达到同步块可以达到的所有目的?,java,multithreading,synchronization,Java,Multithreading,Synchronization,假设我有一个代码片段,我想在链接列表中插入一个节点,为了保持一致性,我使用了以下编码机制:假设current和next是LinkedList的元素,其中current表示我们正在处理的对象,next表示List的下一个对象 synchronized(current) { synchronized(next) { ............. } } 我为当前对象执行了一个insertafter。可以通过同步方法实现相同的功能。因为我们只能在单个对象
synchronized(current) {
synchronized(next) {
.............
}
}
我为当前对象执行了一个insertafter。可以通过同步方法实现相同的功能。因为我们只能在单个对象上获得锁。因此,synchronized insertAfter不会阻止某人使用insertBefore。众所周知,这种模式会导致所谓的“致命拥抱”。想象一下,其他人正在使用您的代码,同时也在使用之前插入了一个
:
synchronized(next) {
synchronized(current) {
.............
}
}
这显然会以眼泪告终
显而易见的答案不是在节点上同步,而是在节点之间的连接上同步。同步方法只不过是synchronized(this){…}
的语法糖
所以你问题的字面答案是“不容易”。在声明这两个同步方法的地方,需要两个不同的对象,并从另一个调用其中一个。但这似乎是个坏主意
一般来说,我质疑将显式同步块简化为同步方法的目标。同步块更具可读性,并且允许您封装锁对象,以防止在某些其他代码出于某种原因决定使用与锁相同的实例时发生意外的锁争用
另外,您确定需要尝试执行的那种细粒度锁定吗?这似乎容易出错。。。对于列表中的任何操作,更简单的代码都会在同一对象上同步。我不太明白您想要实现什么。你能带我们走过吗?什么是当前的
,什么是下一个
?为什么要在节点内的元素上同步?还是节点本身?不管怎样,你应该在一个锁对象上同步。我刚刚制作了一个例子,这样我就可以知道天气同步的方法可以满足同步块的所有用途。