tryLock方法 – 非阻塞方法?

tryLock方法的文档说它是一种非阻塞方法
它允许您获取/获取锁(如果在调用方法时可能)。

但我想知道:你怎么能获得锁定并同时保证
你的方法( tryLock )是非阻塞的吗?! 获取锁意味着你
试图访问受保护的代码部分,以便它应该阻止(如果你不幸运
即你应该至少在某些情况下阻止)。 任何人都可以解释逻辑
这背后? 纯粹从逻辑的角度来看:我不太明白这是怎么回事
完成(保证方法不会阻止)。 除非他们使用另一个
线程当然在tryLock本身的代码中……

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html#tryLock%28%29

这些机制的大多数实现使用所谓的CAS CPU指令来基于变量执行primefaces操作。 CAS表示比较和交换。 它们会查看变量的值,如果它是您所期望的,则更改它。 这提供了线程安全(非阻塞/锁定)方式来对multithreading数据进行比较。

CAS指令以primefaces方式执行以下操作:

 private int stored = 0; public int compareAndSwap(int expectedValue , int newValue) if(expectedValue == stored) stored = newValue; return stored; } 

这些非阻塞机制通常只是重试上述函数,直到成功(返回值是预期值)。 因为重试循环非常短,所以每次迭代中线程中断的可能性很小(或者实际上OS调度程序甚至会使其无法实现)。

实际的java锁( Lock只是它们实现的接口)都非常复杂,因为它们提供了额外的function。 但实质上CAS机制是大多数非阻塞线程安全类的基础。

如果您对锁定的内部工作感兴趣,那么Java Concurrency in Practice是一个很好的来源。 轻松地开始Java并发可以做什么,并推进它如何做到这一点。 (即使对于非Java程序员来说,它也是一个很好的来源)。 你的问题在第15章处理。

获取锁意味着您正在尝试访问受保护的代码段,因此它应该阻止(如果您不幸运,即至少应该在某些情况下阻止)

如果这是你想要的行为,你应该只使用lock方法。 tryLock在于,如果锁定不可用,则不想阻止它。

实现方式而言 ,取决于个别实现 – 所以你应该看看你感兴趣的实现。我个人认为那些在内部使用synchronized是合理的,如果他们知道没有任何用户指定的代码在synchronized块内运行 – 换句话说,它可以暂时阻止内部管家,但不会在锁本身的持续时间内。

或者当然,可以访问适当的机器级指令的实现可以使用比较和交换等… AtomicBoolean.compareAndSetAtomicBoolean.compareAndSet可能用于非常简单的版本。