
获得徽章 0
赞了这篇文章
赞了这篇沸点
#与A-SOUL一起成为更好的自己#
2023年的夏天
YOYO与掘友一起
在好好生活计划中分享快乐、点赞感动🌈
根据系统筛查连续发布天数以及人工审核内容规范后,现公示中奖名单与全部审核情况。
📮 中奖名单与公示:
sourl.co
中奖邮寄问卷信息,将于10 月 17 日通过站内信的形式发送,请于10月23日23:59点前填写问卷邮寄信息
奖品将会在11月1日统一发送
💕21天的打卡是一个开始
在这个夏天,我们见证了掘友自律健身、分享美食、旅行打卡、好好生活
我们始终期待与各位掘友一起
在稀土掘金技术社区沉淀技术内容、陪伴掘友成长!
相关问题与反馈可联系xitujuejinwenchuang@bytedance.com
2023年的夏天
YOYO与掘友一起
在好好生活计划中分享快乐、点赞感动🌈
根据系统筛查连续发布天数以及人工审核内容规范后,现公示中奖名单与全部审核情况。
📮 中奖名单与公示:
中奖邮寄问卷信息,将于10 月 17 日通过站内信的形式发送,请于10月23日23:59点前填写问卷邮寄信息
奖品将会在11月1日统一发送
💕21天的打卡是一个开始
在这个夏天,我们见证了掘友自律健身、分享美食、旅行打卡、好好生活
我们始终期待与各位掘友一起
在稀土掘金技术社区沉淀技术内容、陪伴掘友成长!
相关问题与反馈可联系xitujuejinwenchuang@bytedance.com
展开

104
61
赞了这篇沸点
赞了这篇沸点
赞了这篇文章
赞了这篇文章
赞了这篇文章
#每天一个知识点#
阻塞队列的由来
我们假设⼀种场景,⽣产者⼀直⽣产资源,消费者⼀直消费资源,资源存储在⼀个
缓冲池中,⽣产者将⽣产的资源存进缓冲池中,消费者从缓冲池中拿到资源进⾏消
费,这就是⼤名鼎鼎的⽣产者-消费者模式。
该模式能够简化开发过程,⼀⽅⾯消除了⽣产者类与消费者类之间的代码依赖性,
另⼀⽅⾯将⽣产数据的过程与使⽤数据的过程解耦简化负载。
我们⾃⼰coding实现这个模式的时候,因为需要让多个线程操作共享变量(即资
源),所以很容易引发线程安全问题,造成重复消费和死锁,尤其是⽣产者和消费
者存在多个的情况。另外,当缓冲池空了,我们需要阻塞消费者,唤醒⽣产者;当
缓冲池满了,我们需要阻塞⽣产者,唤醒消费者,这些个等待-唤醒逻辑都需要⾃
⼰实现。(这块不明⽩的同学,可以看最下⽅结语部分的链接)
这么容易出错的事情,JDK当然帮我们做啦,这就是阻塞队列(BlockingQueue),
你只管往⾥⾯存、取就⾏,⽽不⽤担⼼多线程环境下存、取共享变量的线程安全问
题。
阻塞队列的由来
我们假设⼀种场景,⽣产者⼀直⽣产资源,消费者⼀直消费资源,资源存储在⼀个
缓冲池中,⽣产者将⽣产的资源存进缓冲池中,消费者从缓冲池中拿到资源进⾏消
费,这就是⼤名鼎鼎的⽣产者-消费者模式。
该模式能够简化开发过程,⼀⽅⾯消除了⽣产者类与消费者类之间的代码依赖性,
另⼀⽅⾯将⽣产数据的过程与使⽤数据的过程解耦简化负载。
我们⾃⼰coding实现这个模式的时候,因为需要让多个线程操作共享变量(即资
源),所以很容易引发线程安全问题,造成重复消费和死锁,尤其是⽣产者和消费
者存在多个的情况。另外,当缓冲池空了,我们需要阻塞消费者,唤醒⽣产者;当
缓冲池满了,我们需要阻塞⽣产者,唤醒消费者,这些个等待-唤醒逻辑都需要⾃
⼰实现。(这块不明⽩的同学,可以看最下⽅结语部分的链接)
这么容易出错的事情,JDK当然帮我们做啦,这就是阻塞队列(BlockingQueue),
你只管往⾥⾯存、取就⾏,⽽不⽤担⼼多线程环境下存、取共享变量的线程安全问
题。
展开
3
8
#每天一个知识点#
锁的升级流程
每⼀个线程在准备获取共享资源时: 第⼀步,检查MarkWord⾥⾯是不是放的⾃⼰
的ThreadId ,如果是,表示当前线程是处于 “偏向锁” 。
第⼆步,如果MarkWord不是⾃⼰的ThreadId,锁升级,这时候,⽤CAS来执⾏切
换,新的线程根据MarkWord⾥⾯现有的ThreadId,通知之前线程暂停,之前线程
将Markword的内容置为空。
第三步,两个线程都把锁对象的HashCode复制到⾃⼰新建的⽤于存储锁的记录空
间,接着开始通过CAS操作, 把锁对象的MarKword的内容修改为⾃⼰新建的记录
空间的地址的⽅式竞争MarkWord。
第四步,第三步中成功执⾏CAS的获得资源,失败的则进⼊⾃旋 。
第五步,⾃旋的线程在⾃旋过程中,成功获得资源(即之前获的资源的线程执⾏完
成并释放了共享资源),则整个状态依然处于 轻量级锁的状态,如果⾃旋失败 。
第六步,进⼊重量级锁的状态,这个时候,⾃旋的线程进⾏阻塞,等待之前线程执
⾏完成并唤醒⾃⼰
锁的升级流程
每⼀个线程在准备获取共享资源时: 第⼀步,检查MarkWord⾥⾯是不是放的⾃⼰
的ThreadId ,如果是,表示当前线程是处于 “偏向锁” 。
第⼆步,如果MarkWord不是⾃⼰的ThreadId,锁升级,这时候,⽤CAS来执⾏切
换,新的线程根据MarkWord⾥⾯现有的ThreadId,通知之前线程暂停,之前线程
将Markword的内容置为空。
第三步,两个线程都把锁对象的HashCode复制到⾃⼰新建的⽤于存储锁的记录空
间,接着开始通过CAS操作, 把锁对象的MarKword的内容修改为⾃⼰新建的记录
空间的地址的⽅式竞争MarkWord。
第四步,第三步中成功执⾏CAS的获得资源,失败的则进⼊⾃旋 。
第五步,⾃旋的线程在⾃旋过程中,成功获得资源(即之前获的资源的线程执⾏完
成并释放了共享资源),则整个状态依然处于 轻量级锁的状态,如果⾃旋失败 。
第六步,进⼊重量级锁的状态,这个时候,⾃旋的线程进⾏阻塞,等待之前线程执
⾏完成并唤醒⾃⼰
展开
评论
点赞