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

来源:9-24 其他BlockingQueue类型的介绍

Panda_io

2021-01-08

    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();
    }
写回答

1回答

悟空

2021-01-10

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
1
Panda_io
哇老师还专门找了资料,有心了,感谢老师!
2021-01-11
共1条回复

深度解密Java并发工具,精通JUC,成为并发多面手

JUC全方位讲解,构建并发工具类知识体系

1599 学习 · 573 问题

查看课程