请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

await()、signal()底层实现原理

    public void put(E e) throws InterruptedException {
        if (e == null) throw new NullPointerException();
        int c = -1;
        Node<E> node = new Node<E>(e);
        final ReentrantLock putLock = this.putLock;
        final AtomicInteger count = this.count;
        putLock.lockInterruptibly();
        try {
            while (count.get() == capacity) {
                //请问老师,这里底层是调用的wait()方法吗?
                notFull.await();
            }
            enqueue(node);
            c = count.getAndIncrement();
            if (c + 1 < capacity)
            //请问老师底层这里是调用的notify()方法唤醒一个执行put的线程去put吗?
                notFull.signal();
        } finally {
            putLock.unlock();
        }
        if (c == 0)
            signalNotEmpty();
    }

正在回答 回答被采纳积分+3

1回答

悟空 2021-01-10 23:12:44

await的底层是LockSupport.park(this);,而它的底层是UNSAFE.park(false, 0L);这是native方法,它本身是由 C 语言来实现的核心功能。park 的意思是停车,让当前运行的线程 Thread.currentThread() 休眠,unpark 的意思是解除停车,唤醒指定线程。这两个方法在底层是使用操作系统提供的信号量机制来实现的,和wait/notify不相同,但原理类似。参考:https://juejin.cn/post/6844903736578408461

https://www.cnblogs.com/Cubemen/p/11691336.html

https://blog.csdn.net/notOnlyRush/article/details/80189283


0 回复 有任何疑惑可以回复我~
  • 提问者 Panda_io #1
    哇老师还专门找了资料,有心了,感谢老师!
    回复 有任何疑惑可以回复我~ 2021-01-11 15:17:44
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信