0

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

synchronized(N1.next)

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

4

3 回答 3

2

您似乎对互斥锁的工作方式有一些奇怪的想法;例如,您之前的问题也是如此。

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

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

于 2013-09-14T04:59:49.240 回答
0

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

于 2013-09-14T04:27:59.250 回答
0

语法是:

SynchronizedStatement:         
  synchronized ( Expression ) 
    Block

进一步引用:

Expression 的类型必须是引用类型,否则会发生编译时错误。

通过首先评估表达式来执行同步语句。

如果 Expression 的评估由于某种原因突然完成,则同步语句由于相同的原因而突然完成。

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

阅读相关的 JLS §14.19

于 2013-09-14T04:41:15.327 回答