搜索
您的当前位置:首页正文

Java并发容器和框架

来源:二三娱乐

ConcurrentHashMap

线程安全的Map。
HashMap线程不安全,HashTable效率太低,于是有了ConcurrentHashMap。

  • get
  • put
  • size

ConcurrentLinkedQueue

线程安全的队列。
线程安全的队列有两种方式:

  • 使用阻塞算法。入队和出队分别用锁实现。

  • 使用非阻塞算法。ConcurrentLinkedQueue就使用非阻塞算法。

  • 入队列
    有offer和add两种方法。add是继承List的,offer是继承Queue。add方法在容量满的时候抛出异常,offer在容量满的时候返回false。

  • 出队列

    • peek:获取但不移除此队列的头;如果此队列为空,则返回 null。
    • poll:获取并移除此队列的头,如果此队列为空,则返回 null。

Java中的阻塞队列

  • 支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。
  • 支持阻塞的移除方法:当队列空时,获取元素的线程会等待队列变为非空。
方法/处理方式 抛出异常 返回特殊值 一直阻塞 超时退出
插入方法 add(e) offer(e) put(e) offer(e,time,unit)
移除方法 remove() poll() take() poll(time,unit)
检查方法 element() peek() 不可用 不可用

JDK7提供了7个阻塞队列

  • ArrayBlockingQueue:一个数组结构组成的有界阻塞队列。
    不保证线程公平的访问队列。
  • LinkedBlockingQueue:一个链表结构组成的有界阻塞队列。
    默认和最大长度为Integer.MAX_VALUE。
  • PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
    可以自定义类实现compareTo(),也可是初始化的时候通过参数Comparator来对元素进行排序。
  • DelayQueue:一个使用优先级队列实现的无界阻塞队列。
    支持延时获取元素的无界阻塞队列。
    队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素,只有在延迟期满时才能从队列中提取元素。
  • SynchronousQueue:一个不存储元素的阻塞队列。
    一个不存储元素的阻塞队列,每一个put操作必须等待一个take操作,否则不能继续添加元素。SynchronousQueue可以看做一个传球手,把生产者的数据直接传递给消费者。
  • LinkedTransferQueue:一个链表结构组成的无界阻塞队列。
    新特性
    • transfer:若当前存在一个正在等待获取的消费者线程,即立刻移交之;否则,会插入当前元素e到队列尾部,并阻塞到该元素被消费者消费之后返回。
    • tryTransfer(E e):若当前存在一个正在等待获取的消费者线程(使用take()或者poll()函数),使用该方法会即刻转移/传输对象元素e;若不存在,则返回false,并且不进入队列。这是一个不阻塞的操作。
    • tryTransfer(E e,long timeout, TimeUnit unit):试图把生产者传入的元素直接传给消费者,如果没有消费者消费该元素则等待指定时间再返回,返回false,同时该元素被移除。如果在超过时间内消费了该元素,那么返回true。
  • LinkedBlockingDeque:一个链表结构组成的双向阻塞队列。
Top