BlockingQueue中的同步是通过锁来实现的,而ConcurrentLinkedQueue使用的是涉及到CAS的无锁算法。但我的问题是关于上下文切换开销。如果有10个线程从BlockingQueue请求出列,那么一次只有一个线程将锁定队列,并放置9个上下文切换(9个线程将松散),而在ConcurrentLinkedQueue的情况下,没有上下文切换开销,但就时间切片而言,在时间切片结束后,所有10个线程都将一次又一次地切换上下文,与BlockingQueue相比,这不会导致更多的上下文切换开销吗?以下哪一项可减少上下文切换开销?
发布于 2016-02-02 02:00:01
ConcurrentLinkedQueue没有take(),所以我们不能对其进行比较。因此,您正在比较.poll()。我们可以讨论为什么不使用BQ.take(),以及BQ.put()执行signal()而不是signalAll()并且只唤醒一个线程,而不是10个线程,但这是另一个问题。
BQ锁是使用可重入锁实现的,它们本身使用CAS。
唯一的区别是这种锁定的“公平性”(参见reentrantlock的属性),以及可能的并发链接队列的更紧密的锁编码(堆栈深度较小)。
微基准测试,检查操作系统中的CTX开关数量,以及JVM分析器热点...
https://stackoverflow.com/questions/33813593
复制相似问题