BlockingQueue 中的同步是通过 Locks 实现的,而 ConcurrentLinkedQueue 使用的是涉及 CAS 的 Lock-free 算法。但我的问题是关于上下文切换开销。如果有 10 个线程从 BlockingQueue 中取出请求,那么一次只有一个将锁定队列并放置 9 个上下文切换(9 个线程将丢失),而在 ConcurrentLinkedQueue 的情况下,没有上下文切换开销,但就时间切片涉及所有 10 个线程将在时间切片结束后一次又一次地进行上下文切换,与 BlockingQueue 相比,这不会导致更多的上下文切换开销吗?哪一个导致更少的上下文切换开销?
最佳答案
ConcurrentLinkedQueue 没有 take(),所以我们无法比较。
所以你正在比较 .poll()。
我们可以争论为什么不使用 BQ.take() 以及 BQ.put() 执行的是 signal() 而不是 signalAll() 并且只唤醒一个线程,而不是 10 个,但这是另一个问题。
BQ 锁是通过重入锁实现的,本身使用 CAS。
唯一的区别在于这种锁定的“公平性”(参见可重入锁的属性),以及并发链接队列的更严格的锁编码(堆栈帧的深度更小)。
微基准测试,检查操作系统中的 CTX 开关计数,以及 JVM 分析器热点......
关于java - BlockingQueue 中的上下文切换开销,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33813593/