马哥高端Go语言百万并发高薪班7期2022

本文探讨了Go语言中阻塞队列的实现,参照ArrayBlockingQueue,利用锁和同步机制实现通知模式。分析了JDK中的park和unpark方法在不同操作系统下的实现,并介绍了多种进程通讯方式,包括消息队列、共享内存、信号量和socket等。
摘要由CSDN通过智能技术生成

## download:马哥高端Go语言百万并发高薪班7期2022

说说阻塞队列的实现:可以参考ArrayBlockingQueue的底层实现(锁和同步都行);

如果队列是空的,消费者会一直等待,当生产者添加元素时候,消费者是如何知道当前队列有元素的呢?如果让你来设计阻塞队列你会如何设计,让生产者和消费者能够高效率的进行通讯呢?让我们先来看看JDK是如何实现的。

使用通知模式实现。所谓通知模式,就是当生产者往满的队列里添加元素时会阻塞住生产者,当消费者消费了一个队列中的元素后,会通知生产者当前队列可用。

通过查看JDK源码发现ArrayBlockingQueue使用了Condition来实现当我们往队列里插入一个元素时,如果队列不可用,阻塞生产者主要通过LockSupport.park(this);来实现继续进入源码,发现调用setBlocker先保存下将要阻塞的线程,然后调用unsafe.park阻塞当前线程unsafe.park是个native方法,park这个方法会阻塞当前线程,只有以下四种情况中的一种发生时,该方法才会返回。

与park对应的unpark执行或已经执行时。注意:已经执行是指unpark先执行,然后再执行的park。线程被中断时。如果参数中的time不是零,等待了指定的毫秒

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值