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
012021-01-11
相似问题