BlockingQueue中的上下文切换开销

时间:2015-11-19 20:18:13

标签: java multithreading concurrency context-switch

BlockingQueue中的同步由Locks实现,而ConcurrentLinkedQueue使用涉及CAS的无锁算法。但我的问题是关于上下文切换开销。如果有10个线程从BlockingQueue中排队请求,那么一次只有一个将锁定队列,将放置9个上下文切换(9个线程将松散),而在ConcurrentLinkedQueue的情况下,没有上下文切换开销但是至于时间切片涉及所有10个线程将在时间片结束后一次又一次地进行上下文切换,与BlockingQueue相比,这不会导致更多的上下文切换开销吗?哪一个导致上下文切换开销较少?

1 个答案:

答案 0 :(得分:0)

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

BQ锁使用可重入锁实现,本身使用CAS。

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

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