(非阻塞队列)
非阻塞队列,若线程从队列中获取元素,若没有则直接返回空,不会阻塞当前线程
一个线程的失败或挂起不应该影响其他线程的失败或挂起,这样的算法称为非阻塞算法;
ava中提供了基于CAS非阻塞算法实现的队列,比较有代表性的有ConcurrentLinkedQueue和LinkedTransferQueue。
ConcurrentLinkedQueue:
是一个基于链表的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。ConcurrentLinkedQueue的线程安全是通过其插入、删除时采取CAS操作来保证的。由于使用CAS没有使用锁,所以获取size的时候有可能进行offer,poll或者remove操作,导致获取的元素个数不精确,所以在并发情况下size函数不是很有用。
LinkedTransferQueue。
(阻塞队列)
ArrayBlockingQueue;linkedBlockingQueue;priorityBlockingqueue;delayQueue;synchrousQueue;LinkedBlockingDequeue;
1)在队列为空时,获取元素的线程会等待队列变为非空;2)当队列满时,存储元素的线程会等待队列可用。因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被堵塞,除非有另一个线程做了出队列的操作;同样,当一个线程试图对一个空队列进行出队列操作时,它将会被阻塞,除非有另外一个线程进行了入队列的操作。
1)在队列为空时,获取元素的线程会等待队列变为非空。
2)当队列满时,存储元素的线程会等待队列可用。
当一个线程试图对一个已经满了的队列进行入队列的操作是,它将会被堵塞,除非有另一个线程做了一个出队列的操作。同样,当一个线程试图对一个空队列进行出列操作时,这个线程将会阻塞,除非另一个线程进行了入列操作。
(一个线程会影响其他线程->阻塞队列,一个线程不会影响其他队列->非阻塞队列)