Vector,HashTable,线程安全,效率较低,目前少用。常用Quere,ConcurrentHashMap等
CopyOnWriteList ,写的时候拷贝一个副本,在副本上操作,写完后把引用指向新的数组。只有写方法加锁,使用synchronized。读方法不加锁。因为写方法时在副本上操作的,没有更新引用时,不影响旧数组。适用于读多写少的情况。
ConcurrentHashMap,CAS,读效率高
ConcurrentSkipListMap,基于跳跃表,可排序。
Quere,尽量选Quere而不是Vector/List,Quere提供了offer(),peek(),poll()等对线程友好的方法。array满了,add()报异常,offer不会。BlockingQueue 还提供了put(),take()阻塞方法。
几种BlockingQuere:
ArrayBlockingQuere,有界队列,基于数组,指定大小后,不会自动扩张。
LinkedBlockingQuere,基于链表,最长可到Integer最大值。
DelayQuere,按等待时间排序,按时间进行任务调度。本质上是优先队列PriorityQuere。
SynchronusQuere,容量为0,目的不是装东西,而是用于一个线程给另一个线程间传递值(一对一),只能传一个值。如果没有消费者,则会一直阻塞。调用add()会报异常,因为容量为0,所以应该调用put()阻塞方法。
TransferQuere,可接受多个线程传递值(多对多)。比SynchronusQuere多了一个transfer()方法,阻塞的,等有其他线程消费它传递的值。