加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – BlockingQueue中的Context Switch开销

发布时间:2020-12-15 02:11:32 所属栏目:Java 来源:网络整理
导读:BlockingQueue中的同步由Locks实现,而ConcurrentLinkedQueue使用涉及CAS的无锁算法.但我的问题是关于上下文切换开销.如果有10个线程从BlockingQueue中排队请求,那么一次只有一个将锁定队列,将放置9个上下文切换(9个线程将松散),而在ConcurrentLinkedQueue的
BlockingQueue中的同步由Locks实现,而ConcurrentLinkedQueue使用涉及CAS的无锁算法.但我的问题是关于上下文切换开销.如果有10个线程从BlockingQueue中排队请求,那么一次只有一个将锁定队列,将放置9个上下文切换(9个线程将松散),而在ConcurrentLinkedQueue的情况下,没有上下文切换开销但是至于时间切片涉及所有10个线程将在时间片结束后一次又一次地进行上下文切换,与BlockingQueue相比,这不会导致更多的上下文切换开销吗?哪一个导致上下文切换开销减少?

解决方法

ConcurrentLinkedQueue没有take(),所以我们无法比较它.
所以你要比较.poll().
我们可以辩论你为什么不使用BQ.take()以及BQ.put()执行signal()而不是signalAll()这一事实并且只唤醒一个线程,而不是10,但这是另一个问题.

BQ锁使用重入锁实现,它们本身使用CAS.

唯一的区别在于这种锁定的“公平性”(参见reentrantlock的属性),并且可能是并发链接队列的更严格的锁定编码(更少的堆栈帧深度).

Microbenchmark,检查操作系统中的CTX交换机计数,以及JVM分析器热点……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读