Queue
队列Queue是一个并发容器
static Queue<String> tickets = new ConcurrentLinkedQueue<>();
用这一条语句来生成一个链表实现的队列,它是支持多线程的。
String s = tickets.poll();
用这一条语句来取出队列中的值,这一条语句具有原子性。
ConcurrentHashMap
ConcurrentSkipListMap
Hashtable
HashMap
统一使用方法:
Map<String,String> map = new XXXX<>();
比如: Map<String,String> map = new ConcurrentSkipListMap<>();
以上容器都属于并发类容器,其方法均具有原子性!使用上述容器装载高并发读写增减的对象比较合适且高效。
synchronizedMap
这是一个特殊的方法,可以把不加锁的Map变成加锁的Map,如下
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
注意:Java1.8之后,synchronized的效率并不低了!
复制容器(copy on write)
List<String> lists = new CopyOnWriteArrayList<>();
多线程环境下,写时效率低,读时效率高,比较适合写少读多的环境。
SynchronizedList
List<String> strs = new ArrayList<>();
List<String> strsSync = Colletions.synchronizedList(strs);
给不加锁的容器加上锁
阻塞式容器(LinkedBlockingQueue)
static BlockingQueue<String> strs = new LinkedBlockingQueue<>();
...
strs.put( "a" + i ); //如果满了,就会等待
strs.take(); //如果空了,就会等待
...
此类容器不用担心出错
阻塞式容器(ArrayBlockingQueue)
static BlockingQueue<String> strs = new ArrayBlockingQueue<>();
...
strs.put( "a" + i );
...
strs.offer("aaa"); //这个功能和put相似,都是往容器里加东西,不同的是,offer不会提示加没加成功,只能通过返回的布尔值判断
...
strs.offer("aaa", 1, TimeUnit.SECONDS); //可设置过时,1秒钟之后没加成功就放弃了
此类容器不用担心出错
阻塞式容器(DelayQueue)
此容器中的每一个元素都自己记载着自己还有多长时间被消费者拿走,等待时间长的排在前面,先被拿走。
static BlockingQueue<String> strs = new DelayQueue<>();
此容器可以应用在定时任务上