并发容器
Queue实际上就是一个队列。
队列是为了完成任务的装载的这种取和装这里面最重要的是叫做阻塞队列,它的实现初衷就是为了线程池、高并发做准备。
Map
Hashtable
所有的方法默认都是加synchronized的,多数的时候我们的程序只有一个线程在工作,所以这种情况下完全没有必要加synchronized,因此最开始的时候设计的性能比较差。
HashMap
因为HashMap没有锁,线程不安全。虽然速度比较快,但是数据会出问题,还各种各样的报异常。主要是因为它内部会把这个变成TreeNode。HashMap这个东西,你往里面扔的时候,由于它内部没有锁,所以多线程访问的时候会出现问题。
SynchronizedHashMap
SynchronizedHashMap这个方法,给HashMap我们手动上锁。严格上讲,它和Hashtable效率上区别不大。
ConcurrentHashMap
ConcurrentHashMap是多线程里面真正用的。这个ConcurrentHashMap提高效率主要提高在读上面,由于它往里面插的时候内部又做了各种各样的判断。
From Vect To Queue
ArrayList
没有加锁,线程不安全。
Vector
容器Vector,内部是自带锁的,你去读他的时候就会看到很多方法synchronized,所以用Vector的时候请放心它,线程一定是安全的。
LinkedList
由于你在调用这个并发容器的时候,你是调用了其中的两个原子方法,所以你在外层还得再加上一把锁synchronized(tickets)。
Queue
效率最高的就是Queue,这是最新的一个接口,它的主要目标就是为了高并发用的,就是为了多线程用的。所以,以后考虑多线程这种单个元素的时候多考虑Queue
从Map的角度来讲最早是从Hashtable,先加锁到HashMap去掉锁,再到synchronizedHashMap加一个带锁的版本
到ConcurrentHashMap多线程时候专用。注意,这不是替代关系。
ConcurrentMap
ConcurrentHashMap用hash表实现的这样一个高并发容器。
ConcurrentHashMap里面用的是cas操作它用在tree的时候,用在这个节点上的时候实现起太复杂,所以就没有这个ConcurrentTreeMap,但是有时间也需要这样一个排好序的Map,那就有了ConcurrentSkipListMap跳表结构就出现了。
ConcurrentSkipListMap通过跳表来实现高并发容器并且这个Map是有顺序的。