Java 链表数据结构上的同步问题?

Java 链表数据结构上的同步问题?,java,multithreading,concurrency,locking,Java,Multithreading,Concurrency,Locking,假设链表中只有3个节点N0、N1、N2,我想使用下面的synchronized语句获取N2上的锁 synchronized(N1.next) 上面的语句会做什么,它会先锁定N1,然后锁定N1.next还是直接锁定N1.next?它会自然地锁定N1.next,因为这是指定的对象。是: 进一步引述: 表达式的类型必须是引用类型或编译时 发生错误 首先计算 表情。 如果表达式的计算由于某种原因突然完成, 然后,synchronized语句针对同一个对象突然完成 原因 因此,在您的情况下,是的,无论N

假设链表中只有3个节点N0、N1、N2,我想使用下面的synchronized语句获取N2上的锁

synchronized(N1.next)

上面的语句会做什么,它会先锁定N1,然后锁定N1.next还是直接锁定N1.next?

它会自然地锁定N1.next,因为这是指定的对象。

是:

进一步引述:

表达式的类型必须是引用类型或编译时 发生错误

首先计算 表情。

如果表达式的计算由于某种原因突然完成, 然后,synchronized语句针对同一个对象突然完成 原因

因此,在您的情况下,是的,无论
N1计算结果是什么,都将充当互斥体


相关JL阅读。

您似乎对互斥体的工作方式有一些奇怪的想法;e、 g.你前面的问题也是

执行
synchronized
方法或
synchronized
块时,仅获取一个互斥体;i、 e.只有一个“东西”被锁定。如果其他线程试图获取相同的互斥锁,则获取该互斥锁只会影响其他线程


没有“如果我锁上这个,它也会锁上那个”。只有当您的应用程序始终使用特定的互斥/锁来表示时,才会发生这种情况。

但假设在这段时间内,当另一个线程尝试读取N1的值时,另一个线程尝试修改N1。next作为N1。next不是原子操作,那么会发生什么?什么都不会发生。互斥的内容并不重要。互斥锁是一种密钥机制,你所关心的只是密钥,而不是它的外观或其他细节。我明白你想表达的意思,但问题是如果我获得了一个对象的锁,它不会隐式地锁定其所有成员,还是它们有各自的锁要获取?@AnkitSablok你不会锁定对象。获取对象的锁或互斥锁。在您的示例代码中,它将是N1.next的互斥体,即N2。没有隐含的成员锁定或任何此类胡说八道。@AnkitSablok我完全冷了。你知道我有什么心烦吗?是的,我以为你很心烦,但是是的,你对我说得很清楚:),谢谢that@AnkitSablok-我相信我已经为你回答了。至少两次。
SynchronizedStatement:         
  synchronized ( Expression ) 
    Block