java - tryLock 方法 - 非阻塞方法?

标签 java concurrency

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

但我想知道:如何才能在获得锁的同时保证
你的方法 (tryLock) 是非阻塞的?!获得锁意味着你是
试图访问一段 protected 代码,因此它应该被阻止(如果你运气不好
即你至少应该在某些情况下阻止)。谁能解释一下逻辑
这背后?纯粹从逻辑的角度:我不太明白这怎么能
完全完成(保证该方法不会阻塞)。除非他们使用另一个
线程当然在 tryLock 本身的代码中......

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

最佳答案

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

CAS 指令自动执行以下操作:

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

   if(expectedValue == stored)
       stored = newValue;

   return stored;
}

这些非阻塞机制一般只是重试上面的函数,直到成功(返回值是期望值)。因为重试循环非常短,线程在每次迭代中中断的可能性很小(或者在实践中,操作系统调度程序甚至会使其不可能)。

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

如果您对锁定的内部工作原理感兴趣,Java Concurrency in Practice是一个很好的来源。从 Java 并发可以做什么开始,然后逐步了解它是如何做的。 (即使对于非 Java 程序员来说,它也是一个很好的资源)。您的问题在第 15 章中处理。

关于java - tryLock 方法 - 非阻塞方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27602914/

相关文章:

java - "Atomically"更新整个数组

java - 偏好 Activity 中的广告 "Not enough space to show ad! Wants: <480, 75>, Has: <432, 1073741823>"

java - 转换为 JSON 字符串时日期递减一天 - Java

java - 是否有 -noverify jvm 标志的替代方案?

java - 如何要求方法上的参数具有特定的注释?

维护进程池的 Java 库

java - Tomcat静态变量的使用

file - 从文件中读取而不锁定它

java - 如何确保在使用 spring 的数据库更新语句中没有竞争条件

asp.net-mvc - 在编辑操作中使用 RowVersion 的 ASP.NET MVC 并发