我的大致总结:
HashTable所有的读写类方法,都是synchronized;
ConcurrentHashMap(jdk1.8)只有put等写的方法才有synchronized代码块, get没有。
Vector所有的读写类方法,都是synchronized;
CopyOnWriteArrayList只有写的方法才用到了ReentrantLock, get没有。
由此联想到数据库事务里的共享锁和互斥锁,只有共享锁与共享锁相容,意味着读读相容,读写互斥,写写互斥。
HashTable与Vector,连读读之间都是互斥的。
而ConcurrentHashMap和CopyOnWriteArrayList,读读可并发,读写也可,只有写与写之间不可并发。所以它们的并发性更强。
当然,ConcurrentHashMap对比于HashTable还有一大区别,就是它的锁的粒度更细。不过这不是本文的重点。
更新:以下内容来源于Java Concurrency in Practice: