当前位置: 首页 > 知识库问答 >
问题:

lock()方法在ReentrantLock java中的工作原理

闻深
2023-03-14

我试图理解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()方法是如何工作的,但找不到问题的答案。


共有1个答案

程墨竹
2023-03-14

如果当前线程无法获取资源(即,另一个线程已经获取了该资源),那么当前线程必须等待。在这种情况下,ReentrantLock调用selfInterrupt()方法。

否,如果tryAcquire返回false,将调用acquiredqueued。在内部,该方法使用LockSupport#park来取消线程调度。javadoc声明

如果许可证可用,则该许可证被消耗,呼叫立即返回;否则,出于线程调度目的,当前线程将被禁用,并处于Hibernate状态,直到发生以下三种情况之一:
-[…]
-其他线程会中断当前线程;

实际上,它不会抛出一个InterruptedException,在这种情况下,该方法只会返回。要检查对应的线程是否因中断而被唤醒,它必须使用thread#interrupted(),根据具体情况返回true或false,同时清除相应线程实例上的中断标志。

因此,获取队列传播该中断值备份,并让获取重置线程上的中断标志,如果需要在那一小段代码中

if (!tryAcquire(arg) &&
    acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
    selfInterrupt();

另外,在资源被另一个线程释放后,当前线程如何自动启动?

同样,它使用带有unparkLockSupport实用程序

使给定线程的许可证可用(如果尚未可用)。如果线程在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