Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
假设链表 N0 、 N1 、 N2 中只有 3 个节点,我想使用以下同步语句获取 N2 上的锁
synchronized(N1.next)
上面的语句会做什么,是先锁N1再锁N1.next还是直接锁N1.next?
您似乎对互斥锁的工作方式有一些奇怪的想法;例如,您之前的问题也是如此。
当你执行一个synchronized方法或一个synchronized块时,只获取一个互斥锁;即只有一个“东西”被锁定。如果其他线程尝试获取相同的互斥锁,则获取该互斥锁只会影响其他线程。
synchronized
没有“如果我锁定这个,它也会锁定那个”。仅当您的应用程序始终使用特定的互斥锁/锁来表示该含义时,才会发生这种情况。
它自然会锁定 N1.next,因为这是指定的对象。
语法是:
SynchronizedStatement: synchronized ( Expression ) Block
进一步引用:
Expression 的类型必须是引用类型,否则会发生编译时错误。 通过首先评估表达式来执行同步语句。 如果 Expression 的评估由于某种原因突然完成,则同步语句由于相同的原因而突然完成。
Expression 的类型必须是引用类型,否则会发生编译时错误。
通过首先评估表达式来执行同步语句。
如果 Expression 的评估由于某种原因突然完成,则同步语句由于相同的原因而突然完成。
所以是的,在你的情况下,无论N1.next评估为什么,都将充当互斥锁。
N1.next
阅读相关的 JLS §14.19。