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分析器热点…… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |