Java7并发编程--5、并发集合

Java提供了两类适用于并发场景下的集合:
  • 阻塞式集合(Blocking Collection):这类集合包括添加和移除数据的方法,当集合已满或为空时,被调用的添加或者移除方法就不能立即被执行,那么调用这个方法的线程将被阻塞,一直到该方法可以被成功执行。
  • 非阻塞式集合(Non-Blocking Collection):这类集合也包括添加和移除数据的方法,只是如果方法不能立即被执行,则返回null或抛出异常,但是调用这个方法的线程不会被阻塞。
5.1使用非阻塞式线程安全列表ConcurrentLinkedDeque
        一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部是队列中时间最长的元素。队列的尾部是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。
本小节将学习:如何在并发程序中使用非阻塞式列表。非阻塞式列表提供了一些操作,如果被执行的操作不能够立即运行(例如:在列表为空时,从列表取出一个元素)方法会抛出异常活返回null。
  • 要注意 size 在并发情况下。是不准确的。
  • getFirst 和 getLast : 分别返回列表中第一个和最后一个元素,返回的元素不会从列表中移除。如果列表为空,这两个方法抛出NoSuchElementExcpetion
  • peek、peekFirst、peekLast:分别返回列表中第一个和最后一个元素,返回的元素不会从列表中移除。如果列表为空,这些方法返回null
  • remove、removeFirst、removeLast:分别返回列表中第一个和最后一个元素,反回的元素将从列表中移除。如果列表为空,这两个方法抛出NoSuchElementExcpetion
5.2使用阻塞式线程安全列表LinkedBlockingDeque
        一个基于已链接节点的、任选范围的阻塞双端队列。 
        可选的容量范围构造方法参数是一种防止过度膨胀的方式。如果未指定容量,那么容量将等于 Integer.MAX_VALUE。只要插入元素不会使双端队列超出容量,每次插入后都将动态地创建链接节点。
   并发列表允许不同的线程在同一时间添加活移除列表中的元素,而不会造成数据不一致。  
       阻塞式列表与非阻塞式列表的主要差别是:
       阻塞式:在插入时,如果列表已满,在删除时,如果列表为空,操作不会被立即执行,而是将调用这个操作的线程阻塞队列直到可以执行成功。
       非阻塞式:在取出一个元素时,如果列表为空,则会返回null或则抛出异常。
       方法:
  • takeFirst() 和 takeLast() : 分别返回列表中的第一个和最后ige元素,返回的元素不会从列表中移除。如果列表为空,调用方法的线程将被阻塞直到列表中有可用的元素出现。
  • getFitst() 和 getLast():分别返回列表中第一个和最后一个元素,返回的元素不会从列表中移除。如果列表为空,则抛出NoSuchElementExcpetion
  • peek() 、peekFirst() 和 peekLast():分别返回列表中第一个和最后一个元素,返回的元素不会从列表中删除。如果列表为空,返回null
  • poll()、pollFirst() 和 pollLast():分别返回列表中第一个和最后一个元素,返回的元素将会从列表中移除。如果列表为空,返回null
  • add()、addFirst() 和 addLast():分别将元素添加到列表中第一位和最后一位。如果列表已满(指定了列表容量),这些方法将抛出IllegalStateException
5.3使用按优先级排序的阻塞式线程安全列表PriorityBlockingQueue
      所有添加进PriorityBlockingQueue的元素必须实现Comparable接口,这个接口提供CompareTo()方法,他的传入参数是同一类型的对象。插入元素的时候,PriorityBlockingQueue使用compareTo()方法来决定插入元素的位置,元素越大越靠后。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值