同步类容器在执行每个操作期间都持有一个锁。ConcurrentHashMap并不是将每个方法都在同一个锁上同步并使得每次只能有一个线程访问容器,而是使用一种更细粒度的加锁机制来实现更大程度的共享,这种机制称为分段锁。当程序需要加锁Map以进行独占访问时,才应该放弃使用ConcurrentHashMap。
可以采用vector代替ArraysList,Hashtable代替HashMap。它们底层都使用Conllection.sychronizedMap,降低了并发量,和程序的吞吐性。
CurrentHashMap, CopyOnWriteArraysList.(适用读多写少的情况)
1.vector为什么被淘汰
随机访问速度快,插入和移除性能较差(数组的特点);支持null元素;有顺序;元素可以重复;线程安全
2.CurrentHashMap1 .7 和1 .8 中的不同
1.7中是采用Segment + HashEntry的方式进行实现,
1.8中是采用Node + CAS + Synchronized来保证并发安全进行实现
3CopyOnWirte原理
跟字面意思一样CopyOnWirte的意思就是在对列表进行写操作的时候,对列表进行复制。具体原理是:当需要向CopyOnWriteList添加元 素的时候,先对列表进行copy,得出一份副本,然后在副本上面进行添加元素,添加元素结束后再将原列表的引用指向副本列表。那么是否是当同时有多个线程再添加元素的时候是否会同时复制出多个副本呢?答案是:不会。因为,add()方法里是加了锁的,所以不可能出现同时复制出多个副本的情况;但是,CopyOnWriteList对读操作是没有添加锁的。
网友评论