Java中的容器,线程安全和线程不安全的分别有哪些?
Java.util包下的容器大多是线程不安全的,像我们常用的HashSet,TreeSet,ArrayList,LinkedList,ArrayQueue,HashMap,TreeMap大都是线程不安全的集合类,但是优点是性能好。可以使用Collections工具类提供的synchronizedXxx()方法,将这些集合类包装成线程安全的集合类。Vector,Hashtable线程安全但是过于古老。
以Concurrent开头的集合类:支持并发访问的集合,它们可以支持多个线程并发写入访问,这些写入线程的所有操作都是线程安全的,但读取操作不必锁定。以Concurrent开头的集合类采用了更复杂的算法来保证永远不会锁住整个集合,因此在并发写入时有较好的性能。
以CopyOnWrite开头的集合类:采用复制底层数组的方式来实现写操作。当线程对此类集合执行读取操作时,线程将会直接读取集合本身,无须加锁与阻塞。当线程对此类集合执行写入操作时,集合会在底层复制一份新的数组,接下来对新的数组执行写入操作。由于对集合的写入操作都是对数组的副本执行操作,因此它是线程安全的。