确保按顺序采用Java同步锁?

MrG*_*MrG 11 java multithreading synchronization

我们有两个线程通过synchronized方法访问一个列表.我们可以吗

a)依靠运行时间来确保每个人都可以根据他们尝试的顺序或方式接收方法

b)VM是否遵循任何其他规则

c)是否有更好的方法来序列化请求?

Har*_*ded 20

不,synchronized将以任何顺序提供访问权限(取决于JVM实现).这甚至可能导致线程在某些情况下挨饿.

您可以使用ReentrantLock(自Java 5.0起)fair=true选项来确保订单.(Lock lock = new ReentrantLock(true);)

  • "synchronized将以随机顺序提供访问权限(或谁是最快获取锁定的权限)".订单根本没有指定.它几乎肯定不是随机的,并且它依赖于实现(并且极不可能)"第一"线程将始终获得锁定...尤其是在多处理器系统上. (4认同)
  • ReentrantLock的文档说关于fair = true,"当设置为true时,在争用下,锁定有利于授予对等待时间最长的线程的访问权限",因此设置实际上并不强制执行严格的排序. (4认同)
  • 顺序不是随机的,也不能保证是随机的。一旦一个线程阻塞,它就可以进行上下文切换,因此它不会在一段时间内再次尝试,因此您可以在许多线程中有一个线程多次获得锁定,然后另一个线程有机会唤醒。 (3认同)
  • 你是对的,斯蒂芬.但是你不能在特定的实现上进行中继,因此程序员必须期待随机行为. (2认同)

Ste*_*n C 11

不,你不能确定按顺序发生两次同步方法调用.订单未指定且依赖于实现.

这在JLS 的17.1 Locks部分中定义.请注意,没有说明等待锁的线程应该获得访问权的顺序.