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:一个链表结构组成的双向阻塞队列。