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

Java ArrayBlockingQueue获取源代码

江正德
2023-03-14

我认为两个线程同时调用take方法,只有一个线程可以成功地获得锁,而另一个线程将在以下行等待锁:lock.lockinterruptibly();这是take的源代码:

public E take() throws InterruptedException {
    final ReentrantLock lock = this.lock;
    lock.lockInterruptibly();
    try {
        while (count == 0)
            notEmpty.await();
        return dequeue();
    } finally {
        lock.unlock();
    }
}

但是,当我对这两个线程进行线程转储时,我发现两个线程都成功锁定,并且在线等待:notempty.await();(因为队列为空)这是线程转储:

“test-thread-18”#6357守护进程prio=5 os_prio=0 tid=0x00007f8f54543000 nid=0x58ef在条件[0x00007f901bc70000]java.lang.thread.state:waiting(parking)在sun.misc.unsafe.park(本机方法)-parking在java.util.concurrent.locks.abstrictqueuedsynchronizer$conditionobject<0x00007f93ae695410>(a await(AbstractQueuedSynchronizer.java:2039)在java.util.concurrent.ArrayBlockingQueue.take(ArrayBlockingQueue.java:403)在java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)在java.util.concurrent.ThreadPoolExecutor.runworker(ThreadPoolExecutor.java:1127)在

“test-thread-17”#6356守护进程prio=5 os_prio=0 tid=0x00007f8f54542000 nid=0x58ee在条件[0x00007f901beb9000]java.lang.thread.state:waiting(parking)在sun.misc.unsafe.park(本机方法)-在java.util.concurrent.locks.locks.locks.park(locksupport.java.util.concurrent.locks.abstractQueuedSynchronizer:175)在wait(AbstractQueuedSynchronizer.java:2039)在java.util.concurrent.ArrayBlockingQueue.take(ArrayBlockingQueue.java:403)在java.util.concurrent.ThreadPoolExecutor.GetTask(ThreadPoolExecutor.java:1067)在java.util.concurrent.ThreadPoolExecutor.runworker(ThreadPoolExecutor.java.concurrent.ThreadPoolExecutor.java.1127)在

那么,为什么两个不同的线程可以在同一时间获得相同的锁呢?我的理解有什么问题?

共有1个答案

安轶
2023-03-14

只有一个线程可以同时保存reentrantlock

notemptycondition对象,当前线程将在调用condition.await()时释放锁:

使当前线程等待,直到发出信号或中断。与此条件相关联的锁被原子释放,当前线程出于线程调度的目的被禁用,并处于Hibernate状态,直到发生以下四种情况之一:

    null
 类似资料:
  • <?php $http = HttpRequest::newSession(); $response = $http->get('http://www.baidu.com/'); $content = $response->body(); // 网页源码

  • 问题内容: 如何不使用来获取html源代码? 我需要知道这一点,因为在某些虚拟主机上已禁用,因此您不能使用。是否可以使用cURL获取html文件的源(如果启用了cURL支持)?如果是这样,怎么办?谢谢。 问题答案: 请尝试以下操作: 我只推荐小文件使用。大文件将作为一个整体读取,并且可能会产生内存错误。 编辑:在评论中进行了一些讨论之后,我们发现问题是服务器无法解析主机名,并且该页面另外是http

  • 主要内容:本节引言,1.要准备的三个工具,2.使用apktool反编译APK获得图片与XML资源:,3.使用dex2jar将classes.dex转换成jar文件:,4.使用jd-gui查看jar包中的Java代码:,本节小结本节引言 "反编译Apk",看上去好像好像很高端的样子,其实不然,就是通过某些反编译软件,对我们的APK进行反编译,从而获取程序的源代码,图片,XML资源等文件;不知道你有没有这样做过,看到一个别人的一个APP界面做得很精美,或者你看上别人的图片素材,简单点的,我们可以下载

  • 本文向大家介绍C#获取网页源代码的方法,包括了C#获取网页源代码的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#获取网页源代码的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 我正在使用Eclipse IDE。首先,我想开发一个插件,这个插件使我可以将整个源代码作为一个简单的字符串来获取。 我使用模板“ hello world命令”制作了一个简单的“ hello the world”插件。现在,我正在寻找从Eclipse编辑器中获取源代码,并使用System.out.println()进行显示;而不是显示HELLO THE WORLD。 我试过了,但是它只显

  • 问题内容: 首先介绍技术资料: 我们正在使用VS 2008 pro并正在运行MS SQL 2008服务器。对于源代码控制,我们使用Subversion。 我们真的很想让我们的存储过程处于颠覆状态,因此我们可以知道更改的内容,时间等。 但是,要使其正常工作,它必须是无缝的,否则,开发人员将忘记将过程包括在其提交中。 那么,对此有什么好的解决方案吗? 我敢肯定我们不能成为唯一拥有此问题的公司:-) 问