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

时间:2013-09-14 04:24:26

标签: java multithreading concurrency locking

假设链接列表N0,N1,N2中只有3个节点,我想使用以下同步语句获取N2上的锁

synchronized(N1.next)

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

3 个答案:

答案 0 :(得分:2)

您似乎对互斥体如何工作有一些奇怪的想法;例如你以前的问题。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

syntax是:

SynchronizedStatement:         
  synchronized ( Expression ) 
    Block

进一步引用:

  

Expression的类型必须是引用类型或编译时   发生错误。

     

同步语句首先执行评估   表达

     

如果表达式的评估由于某种原因突然完成,   然后同步语句突然完成相同的操作   原因。

所以在你的情况下,无论N1.next评估的是什么,都将充当互斥锁。

相关JLS §14.19已阅读。