• 请不要在回答技术问题时复制粘贴 AI 生成的内容
zxc1234
V2EX  ›  程序员

关于 LinkedBlockingQueue 与 ArrayBlockingQueue

  •  
  •   zxc1234 · Mar 18, 2020 · 2169 views
    This topic created in 2271 days ago, the information mentioned may be changed or developed.

    ArrayBlockingQueue 采用的是全局锁

    LinkedBlockingQueue 在元素出队列和入队列分别分别使用不同的锁

    如果说这么做 LinkedBlockingQueue 的使用效率比较高,那么 ArrayBlockingQueue 为什么不使用两把锁

    如果说这么做 ArrayBlockingQueue 实现比较简单,那么 LinkedBlockingQueue 为什么不使用全局锁

    菜鸟看到这个知识点,不懂,求指教

    5 replies    2020-03-19 09:35:19 +08:00
    guyeu
        1
    guyeu  
       Mar 18, 2020
    发邮件问问 Doug Lea ?
    Windsooon
        2
    Windsooon  
       Mar 18, 2020
    本质来说,是底层实现方式不同所以加锁方式不同,可以参考这里 https://stackoverflow.com/questions/11015571/arrayblockingqueue-uses-a-single-lock-for-insertion-and-removal-but-linkedblocki
    rrfeng
        3
    rrfeng  
       Mar 18, 2020
    字面上看是因为 Array 没法单独操作『头』,『尾』,所以存在冲突。
    zxc1234
        4
    zxc1234  
    OP
       Mar 18, 2020
    @Windsooon
    @rrfeng 看了一下资料,好像是这么说的
    hfc
        5
    hfc  
       Mar 19, 2020
    下面是我当时看源代码总结的,希望对你有所帮助

    ArrayBlockingQueue 和 LinkedBlockingQueue 都有一个 count 域来存储队列元素个数的信息,所以两种队列的增删都会涉及到维护这个 count 值。但是在 LinkedBlockingQueue 中,count 域是 AtomicInteger 类型的,在多线程环境下也是安全的;而 ArrayBlockingQueue 的 count 域在增删时都需要进行加锁,所以只用一个可重入锁会更加方便。ArrayBlockingQueue 相比 LinkedBlockingQueue 在读写时也更加高效,LinkedBlockingQueue 相对也更需要更加细粒度的读写分离控制。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1340 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 43ms · UTC 17:13 · PVG 01:13 · LAX 10:13 · JFK 13:13
    ♥ Do have faith in what you're doing.