阻塞队列和非阻塞队列

      (非阻塞队列)

           非阻塞队列,若线程从队列中获取元素,若没有则直接返回空,不会阻塞当前线程

          一个线程的失败或挂起不应该影响其他线程的失败或挂起,这样的算法称为非阻塞算法;

ava中提供了基于CAS非阻塞算法实现的队列,比较有代表性的有ConcurrentLinkedQueue和LinkedTransferQueue。

ConcurrentLinkedQueue:

是一个基于链表的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。ConcurrentLinkedQueue的线程安全是通过其插入、删除时采取CAS操作来保证的。由于使用CAS没有使用锁,所以获取size的时候有可能进行offer,poll或者remove操作,导致获取的元素个数不精确,所以在并发情况下size函数不是很有用。

LinkedTransferQueue。

(阻塞队列)

ArrayBlockingQueue;linkedBlockingQueue;priorityBlockingqueue;delayQueue;synchrousQueue;LinkedBlockingDequeue;

 1)在队列为空时,获取元素的线程会等待队列变为非空;2)当队列满时,存储元素的线程会等待队列可用。因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被堵塞,除非有另一个线程做了出队列的操作;同样,当一个线程试图对一个空队列进行出队列操作时,它将会被阻塞,除非有另外一个线程进行了入队列的操作。

         1)在队列为空时,获取元素的线程会等待队列变为非空。

         2)当队列满时,存储元素的线程会等待队列可用。

         当一个线程试图对一个已经满了的队列进行入队列的操作是,它将会被堵塞,除非有另一个线程做了一个出队列的操作。同样,当一个线程试图对一个空队列进行出列操作时,这个线程将会阻塞,除非另一个线程进行了入列操作。

(一个线程会影响其他线程->阻塞队列,一个线程不会影响其他队列->非阻塞队列)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值