我试图理解ReentrantLock在java中是如何工作的。
让我们考虑下面的一个简单示例:
private ReentrantLock lock;
public void foo() {
lock.lock();
try{
...
}finally {
lock.unlock();
}
}
我试图弄清楚lock()方法的调用层次结构。
public void lock() {
sync.lock();
}
对于FairSync:
final void lock() {
acquire(1);
}
对于非空中同步:
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
这两个lock()方法都调用参数为1的acquire()方法。
在AbstractQueuedSynsynizer类中:
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
static void selfInterrupt() {
Thread.currentThread().interrupt();
}
如果当前线程无法获取资源(即,另一个线程已经获取了该资源),那么当前线程必须等待。在本例中,ReentrantLock调用selfInterrupt()方法。
现在我的问题是interrupt()方法如何停止一个线程,这个线程相当于synchronized中的wait()方法?
另外,在资源被另一个线程释放后,currentThread如何自动启动?(在另一个线程调用unlock()方法之后,该线程正在内部调用sync。释放(1)
)
我还试图从这里找出interrupt()方法是如何工作的,但找不到问题的答案。
如果当前线程无法获取资源(即,另一个线程已经获取了该资源),那么当前线程必须等待。在这种情况下,ReentrantLock
调用selfInterrupt()
方法。
否,如果tryAcquire
返回false
,将调用acquiredqueued
。在内部,该方法使用LockSupport#park
来取消线程调度。javadoc声明
如果许可证可用,则该许可证被消耗,呼叫立即返回;否则,出于线程调度目的,当前线程将被禁用,并处于Hibernate状态,直到发生以下三种情况之一:
-[…]
-其他线程会中断当前线程;
实际上,它不会抛出一个InterruptedException
,在这种情况下,该方法只会返回。要检查对应的线程是否因中断而被唤醒,它必须使用thread#interrupted()
,根据具体情况返回true或false,同时清除相应线程
实例上的中断标志。
因此,获取队列
传播该中断值备份,并让获取
重置线程
上的中断
标志,如果需要在那一小段代码中
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
另外,在资源被另一个线程释放后,当前线程如何自动启动?
同样,它使用带有unpark
的LockSupport
实用程序
使给定线程的许可证可用(如果尚未可用)。如果线程在park上被阻塞,那么它将解除阻塞。
一、mitmproxy的工作原理 Mitmproxy是一种非常灵活的工具。准确了解代理过程的工作原理将有助于您创造性地部署代理,并考虑其基本假设以及如何解决这些假设。本文档详细介绍了mitmproxy的代理机制,从最简单的未加密显式代理开始,到最复杂的交互操作-在存在服务器名称指示的情况下,对受TLS保护的流量进行透明的代理。 二、显式HTTP 配置客户端以使用mitmproxy作为显式代理是拦截
本文向大家介绍java 中volatile和lock原理分析,包括了java 中volatile和lock原理分析的使用技巧和注意事项,需要的朋友参考一下 java 中volatile和lock原理分析 volatile和lock是Java中用于线程协同同步的两种机制。 Volatile volatile是Java中的一个关键字,它的作用有 保证变量的可见性 防止重排序 保证64位变量(long,
问题内容: 我得到以下代码: 我可以理解诸如阶乘和斐波那契这样的递归,但是对于这一点我不能理解。我试图追踪逻辑: 我总是以其他任何数字结尾7,我知道这是错误的,因为在运行程序时会得到不同的值。您能帮我了解递归在这里如何工作吗? 问题答案: 我认为这是不言自明的,如果您需要更多信息,请评论!
问题内容: 如果我仅向您展示该示例,这将使我更容易解释该问题-> http://jsfiddle.net/RU2SM/ 如您所见,有2个按钮,一个称为“ AJAX”,一个称为“ Direct”。 …因此,如果单击“直接”,它将打开窗口(Chrome上为新标签),但是如果我尝试在AJAX成功处理程序上创建window.open(),则它的工作方式将不同。 我确定问题出在AJAX,但我不知道如何解决。
本文向大家介绍Tensorflow的工作原理相关面试题,主要包含被问及Tensorflow的工作原理时的应答技巧和注意事项,需要的朋友参考一下 参考回答: Tensorflow是用数据流图来进行数值计算的,而数据流图是描述有向图的数值计算过程。在有向图中,节点表示为数学运算,边表示传输多维数据,节点也可以被分配到计算设备上从而并行的执行操作。
JavaScript 有一套完全不同于其它语言的对 this 的处理机制。 在五种不同的情况下 ,this 指向的各不相同。 全局范围内 this; 当在全部范围内使用 this,它将会指向全局对象。 译者注:浏览器中运行的 JavaScript 脚本,这个全局对象是 window。 函数调用 foo(); 这里 this 也会指向全局对象。 ES5 注意: 在严格模式下(strict mod