码上敲享录 > java高并发常见问题 > 多线程可以同时操作非阻塞队列吗?

多线程可以同时操作非阻塞队列吗?

上一章章节目录下一章 2018-09-08已有1898人阅读 评论(0)

多线程可以同时操作非阻塞队列吗?

答:

答案是可以的,而且不阻塞,高效,线程安全。

比如ConcurrentLinkedQueue是一个基于链表实现的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部,当我们获取一个元素时,它会返回队列头部的元素。默认情况下head节点存储的元素为空,tail节点等于head节点(两节点重叠)。


非阻塞队列实现线程安全的原理:

当一个线程调用了入队操作时,会尝试获取链表的tail结点进行插入操作,而插入是通过CAS操作实现的,而CAS具有原子性。在此同时,如果有其他任何一个线程成功执行了插入、删除都会改变tail结点,那么当前线程的插入操作就会失败,通过循环再次定位最新的tail结点位置进行插入,直到成功为止。

当一个线程调用了出队操作时,会尝试获取链表的head结点进行删除操作,而删除是通过CAS操作实现的,而CAS具有原子性。在此同时,如果有其他任何一个线程成功执行了删除都会改变head结点,那么当前线程的删除操作就会失败,则通过循环再次定位head结点位置进行删除,直到成功为止。


本文链接:http://www.yayihouse.com/yayishuwu/chapter/1574

向大家推荐《Activiti工作流实战教程》:https://xiaozhuanlan.com/activiti
0

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交