多线程可以同时操作非阻塞队列吗?
答:
答案是可以的,而且不阻塞,高效,线程安全。
比如ConcurrentLinkedQueue是一个基于链表实现的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部,当我们获取一个元素时,它会返回队列头部的元素。默认情况下head节点存储的元素为空,tail节点等于head节点(两节点重叠)。
非阻塞队列实现线程安全的原理:
当一个线程调用了入队操作时,会尝试获取链表的tail结点进行插入操作,而插入是通过CAS操作实现的,而CAS具有原子性。在此同时,如果有其他任何一个线程成功执行了插入、删除都会改变tail结点,那么当前线程的插入操作就会失败,通过循环再次定位最新的tail结点位置进行插入,直到成功为止。
当一个线程调用了出队操作时,会尝试获取链表的head结点进行删除操作,而删除是通过CAS操作实现的,而CAS具有原子性。在此同时,如果有其他任何一个线程成功执行了删除都会改变head结点,那么当前线程的删除操作就会失败,则通过循环再次定位head结点位置进行删除,直到成功为止。