Java多线程那些事之ConcurrentHashMap
2016-04-18 15:09
801 查看
1. HashTable,SynchronizedHashmap,ConcurrentHashmap
JDK 1.5之前在多线程环境下,map的实现只有hashtable和synchronized hashmap,因为hashmap本身不是线程安全的。ConcurrentHashmap不仅仅是线程安全的,而且在性能上优于hashtable和synchronized hashmap
原因如下:
ConcurrentHashmap的锁分段技术,不是锁定整行
CHM 允许读操作,并且同时对synchronize 写操作保证完整性
CHM 读操作不加锁,This is achieved by partitioning Map into different parts based on concurrency level
and locking only a portion of Map during updates。Default concurrency level is 16, and accordingly Map is divided into 16 part and each part is governed with a different lock. This means, 16 thread can operate
on Map simultaneously until they are operating on different part of Map. This makes ConcurrentHashMap high performance despite keeping thread-safety
intact
Read more: http://javarevisited.blogspot.com/2013/02/concurrenthashmap-in-java-example-tutorial-working.html#ixzz469oTL3TI
CHM 适用于读操作多,写操作少的场景,如果写多或者读写相同,则CHM的性能可能并不由于synchronized hashmap和hashtable。基于此,CHM是非常适合的cache存储结构。
ConcurrentHashMap
You should use ConcurrentHashMap when you need very high concurrency in your project.It is thread safe without synchronizing the whole map.
Reads can happen very fast while write is done with a lock.
There is no locking at the object level.
The locking is at a much finer granularity at a hashmap bucket level.
ConcurrentHashMap doesn’t throw a
ConcurrentModificationExceptionif
one thread tries to modify it while another is iterating over it.
ConcurrentHashMap uses multitude of locks.
SynchronizedHashMap
Synchronization at Object level.Every read/write operation needs to acquire lock.
Locking the entire collection is a performance overhead.
This essentially gives access to only one thread to the entire map & blocks all the other threads.
It may cause contention.
SynchronizedHashMap returns Iterator, which fails-fast on concurrent modification
Now we know What is ConcurrentHashMap in Java and when to use ConcurrentHashMap, it’s time to know and revise some important points about CHM in Java.
1. ConcurrentHashMap allows concurrent read and thread-safe update operation.
2. During the update operation, ConcurrentHashMap only locks a portion of Map instead of whole Map.
3. The concurrent update is achieved by internally dividing Map into the small portion which is defined by concurrency level.
4. Choose concurrency level carefully as a significantly higher number can be a waste of time and space and the lower number may introduce thread contention in case writers over number concurrency level.
5. All operations of ConcurrentHashMap are thread-safe.
6. Since ConcurrentHashMap implementation doesn't lock whole Map, there is chance of read overlapping with update operations like put() and remove(). In that case result returned by get() method will reflect most recently completed operation from there
start.
7. Iterator returned by ConcurrentHashMap is weekly consistent, fail-safe and never throw ConcurrentModificationException.
In Java.
8. ConcurrentHashMap doesn't allow null as key or value.
9. You can use ConcurrentHashMap in place of Hashtable but with caution as CHM doesn't lock whole Map.
10. During putAll() and clear() operations, the concurrent read may only reflect insertion or deletion of some entries.
Read more: http://javarevisited.blogspot.com/2013/02/concurrenthashmap-in-java-example-tutorial-working.html#ixzz469xPQF4X
相关文章推荐
- 转载: Javah生成JNI头文件出现找不到类的错误
- Java正则表达式
- 使用 spring-loaded 热部署
- eclipse修改内存大小
- Java NIO系列2:NIO概述
- ubuntu搭建java开发环境
- Bitmap java实现
- Android studio及eclipse中的junit单元测试
- java集合-TreeSet
- J2SE(六)Java之类的初始化
- springmvc源码分析
- Java连接hadoop注意事项及实例
- JDK7.0 与 JDK6.0 区别 及 JDK7的新特性
- struts2中ognl标签具体解释
- java.util 中的property
- mac 下eclipse 安装svn插件
- 【记录】使用 ZipInputStream类getNextEntry方法遇到的错误
- Java 自定义异常类
- 【SSH框架】--SpringAOP
- Java定位CPU使用高问题