Map的线程安全实现
2017-08-22 14:42
204 查看
Map的线程安全:
实现方式:
1. 使用synchronized词进行自己包装
2. 使用concurrent包下的lock锁自己包装
3. 使用concurrent包下的读写锁
4. 使用conllections.synchronizedMap()方式获取线程安全的map
5. 使用concurrent包中的concurrentHashMap
1、使用synchronized 关键字,代码如下
synchronized(anObject){
value =map.get(key);
}
2、使用 JDK1.5提供的锁(java.util.concurrent.locks.Lock)。代码如下
lock.lock();
value =map.get(key);
lock.unlock();
3、使用 JDK1.5 提供的读写锁(java.util.concurrent.locks.ReadWriteLock)。代码如下
rwlock.readLock().lock();
value =map.get(key);
rwlock.readLock().unlock();
这样两个读操作可以同时进行,理论上效率会比方法 2 高。
4与5:
Map<String, Object> map2 = Collections.synchronizedMap(newTreeMap<String, Object>());
Map<String, Object> map3 = new ConcurrentHashMap<String,Object>();
Collections.synchronizedMap()和Hashtable一样,实现上在调用map所有方法时,都对整个map进行同步,而ConcurrentHashMap的实现却更加精细,它对map中的所有桶加了锁。所以,只要要有一个线程访问map,其他线程就无法进入map,而如果一个线程在访问ConcurrentHashMap某个桶时,其他线程,仍然可以对map执行某些操作。这样,ConcurrentHashMap在性能以及安全性方面,明显比Collections.synchronizedMap()更加有优势。同时,同步操作精确控制到桶,所以,即使在遍历map时,其他线程试图对map进行数据修改,也不会抛出ConcurrentModificationException。
ConcurrentHashMap从类的命名就能看出,它必然是个HashMap。而Collections.synchronizedMap()可以接收任意Map实例,实现Map的同步。
借鉴博文:
http://blog.csdn.net/lanxiangru/article/details/53495854 http://www.cnblogs.com/cloudwind/archive/2012/08/30/2664003.html
实现方式:
1. 使用synchronized词进行自己包装
2. 使用concurrent包下的lock锁自己包装
3. 使用concurrent包下的读写锁
4. 使用conllections.synchronizedMap()方式获取线程安全的map
5. 使用concurrent包中的concurrentHashMap
1、使用synchronized 关键字,代码如下
synchronized(anObject){
value =map.get(key);
}
2、使用 JDK1.5提供的锁(java.util.concurrent.locks.Lock)。代码如下
lock.lock();
value =map.get(key);
lock.unlock();
3、使用 JDK1.5 提供的读写锁(java.util.concurrent.locks.ReadWriteLock)。代码如下
rwlock.readLock().lock();
value =map.get(key);
rwlock.readLock().unlock();
这样两个读操作可以同时进行,理论上效率会比方法 2 高。
4与5:
Map<String, Object> map2 = Collections.synchronizedMap(newTreeMap<String, Object>());
Map<String, Object> map3 = new ConcurrentHashMap<String,Object>();
Collections.synchronizedMap()和Hashtable一样,实现上在调用map所有方法时,都对整个map进行同步,而ConcurrentHashMap的实现却更加精细,它对map中的所有桶加了锁。所以,只要要有一个线程访问map,其他线程就无法进入map,而如果一个线程在访问ConcurrentHashMap某个桶时,其他线程,仍然可以对map执行某些操作。这样,ConcurrentHashMap在性能以及安全性方面,明显比Collections.synchronizedMap()更加有优势。同时,同步操作精确控制到桶,所以,即使在遍历map时,其他线程试图对map进行数据修改,也不会抛出ConcurrentModificationException。
ConcurrentHashMap从类的命名就能看出,它必然是个HashMap。而Collections.synchronizedMap()可以接收任意Map实例,实现Map的同步。
借鉴博文:
http://blog.csdn.net/lanxiangru/article/details/53495854 http://www.cnblogs.com/cloudwind/archive/2012/08/30/2664003.html
相关文章推荐
- 如何实现一个线程安全的map?
- 关于Map线程安全的几种实现方案
- Map集合线程安全的几种实现
- Map线程安全几种实现方法
- Map线程安全几种实现方法
- golang实现线程安全的map
- Map线程安全几种实现方法
- 关于Map线程安全的几种实现方案
- Map线程安全几种实现方法
- Java集合中那些类是线程安全的 以及 Map线程安全几种实现方法
- Map线程安全几种实现方法
- Map线程安全几种实现方法
- Map线程安全几种实现方法
- Map线程安全几种实现方法
- DoubleKeyMap_实现
- Java实现Qt的SIGNAL-SLOT机制(保存到Map中,从而将它们关联起来,收到信号进行解析,最后反射调用)
- 2013年4月23日 腾讯一面之STL中的map实现机制
- 关于Intent传输Map,List的一种实现方式
- JavaWeb开发中Ajax技术、json与java实现List、Map数据直接传递的研究
- Golang的锁和线程安全的Map