在Java并发编程中,经常听到同步容器、并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同步的容器。
同步容器会导致多个线程中对容器方法调用的串行执行,降低并发性,因为它们都是以容器自身对象为锁,所以在需要支持并发的环境中,可以考虑使用并发容器来替代。并发容器是针对多个线程并发访问而设计的,在jdk5.0引入了concurrent包,其中提供了很多并发容器,如ConcurrentHashMap、CopyOnWriteArrayList等。
同步容器与并发容器都为多线程并发访问提供了合适的线程安全,不过并发容器的可扩展性更高。在Java5之前,程序员们只有同步容器,且在多线程并发访问的时候会导致争用,阻碍了系统的扩展性。Java5介绍了并发容器,并发容器使用了与同步容器完全不同的加锁策略来提供更高的并发性和伸缩性,例如,在ConcurrentHashMap中采用了一种粒度更细的加锁机制,可以称为分段锁,在这种锁机制下,允许任意数量的读线程并发地访问map,并且执行读操作的线程和写操作的线程也可以并发的访问map,同时允许一定数量的写操作线程并发地修改map,所以它可以在并发环境下实现更高的吞吐量,另外,并发容器提供了一些在使用同步容器时需要自己实现的复合操作,包括putIfAbsent等,但是由于并发容器不能通过加锁来独占访问,所以我们无法通过加锁来实现其他复合操作了。
同步容器(在并发下进行迭代的读和写时并不是线程安全的)
Vector、Stack、HashTable
Collections类的静态工厂方法创建的类(如Collections.synchronizedList)
通过对容器所有公共方法加synchronzied进行同步实现的(并发环境下性能很差)
JDK 1.5 新增的并发容器(线程安全)
ConcurrentHashMap(代替Map;内部采用Segment结构,进行两次Hash进行定位,写时只对Segment加锁)
CopyOnWriteArrayList(CopyOnWrite写时复制一份新的,在新的上面修改,然后把引用指向新的。只能实现数据的最终一致性,非实时一致的;代替List,适用于读操作为主的情况)
ConcurrentLinkedQueue(队列与列表的不同之处在于队列只能在头和尾对里面的数据进行操作)
PriorityQueue(非并发的)
BlockingQueue
最常用的两个并发容器是 ConcurrentHashMap 和 CopyOnWriteArrayList
加微信(858568103)了解更多的前端、Java知识,了解更多的行业信息。
联系客服