java 从零手写实现 CopyOnWriteHashMap

COW 的思想思想的通用性CopyOnWriteArrayList 和 CopyOnWriteArraySet 这种读写分离的思想是通用的 。
今天就让我们用这种思想实现一个简单的工具:CopyOnWriteHashMap 。
java 从零手写实现 CopyOnWriteHashMap文章插图
HashMap
和 ConcurrentHashMap 的分段加锁不同 , 我们将采用 COW 的思想实现一个属于自己的 COWHashMap 。
实践出真知这个工具包都出来几十年了 , 还是用的人很少 。
要学以致用 , 站在巨人的肩膀上
自己实现一个 copyOnWriteMap类定义public class CopyOnWriteHashMap implements Map, Cloneable {/*** 内部 HashMap* @since 0.0.4*/private volatile Map internalMap;/*** 可重入锁* @since 0.0.4*/private final ReentrantLock lock;/*** 无参构造器** 初始化对应的属性* @since 0.0.4*/public CopyOnWriteHashMap() {this.internalMap = new HashMap();this.lock = new ReentrantLock();}}我们实现 Map接口 , 内部声明 internalMap 用于复用 HashMap 的方法 , 使用 lock 锁保证并发安全 。
无参构造器 , 就是对属性进行简单的初始化 。
核心方法put 方法我们通过并发加锁 , 并且拷贝一份 internalMap 的方式 , 实现 put 操作 。
@Overridepublic V put(K key, V value) {final ReentrantLock lock = this.lock;lock.lock();try {// 拷贝一份Map newMap = new HashMap<>(internalMap);V val = newMap.put(key, value);// 设置为新的internalMap = newMap;return val;} finally {lock.unlock();}}putAll 方法根据一个集合进行初始化 。
@Overridepublic void putAll(Map m) {final ReentrantLock lock = this.lock;lock.lock();try {// 拷贝一份Map newMap = new HashMap<>(internalMap);newMap.putAll(m);// 设置为新的internalMap = newMap;} finally {lock.unlock();}}remove 操作这个实现也是类似的 。
@Overridepublic V remove(Object key) {final ReentrantLock lock = this.lock;lock.lock();try {// 拷贝一份Map newMap = new HashMap<>(internalMap);V val = newMap.remove(key);// 设置为新的internalMap = newMap;return val;} finally {lock.unlock();}}clear 清空操作@Overridepublic void clear() {final ReentrantLock lock = this.lock;lock.lock();try {internalMap.clear();} finally {lock.unlock();}}整体实现一个完整版本的实现如下:
import java.util.Collection;import java.util.HashMap;import java.util.Map;import java.util.Set;import java.util.concurrent.locks.ReentrantLock;/** * COW HashMap * @author 老马啸西风 * @since 0.0.4 * @param key * @param value*/public class CopyOnWriteHashMap implements Map, Cloneable {/*** 内部 HashMap* @since 0.0.4*/private volatile Map internalMap;/*** 可重入锁* @since 0.0.4*/private final ReentrantLock lock;/*** 无参构造器** 初始化对应的属性* @since 0.0.4*/public CopyOnWriteHashMap() {this.internalMap = new HashMap();this.lock = new ReentrantLock();}@Overridepublic int size() {return internalMap.size();}@Overridepublic boolean isEmpty() {return internalMap.isEmpty();}@Overridepublic boolean containsKey(Object key) {return internalMap.containsKey(key);}@Overridepublic boolean containsValue(Object value) {return internalMap.containsValue(value);}@Overridepublic V get(Object key) {return internalMap.get(key);}@Overridepublic V put(K key, V value) {final ReentrantLock lock = this.lock;lock.lock();try {// 拷贝一份Map newMap = new HashMap<>(internalMap);V val = newMap.put(key, value);// 设置为新的internalMap = newMap;return val;} finally {lock.unlock();}}@Overridepublic V remove(Object key) {final ReentrantLock lock = this.lock;lock.lock();try {// 拷贝一份Map newMap = new HashMap<>(internalMap);V val = newMap.remove(key);// 设置为新的internalMap = newMap;return val;} finally {lock.unlock();}}@Overridepublic void putAll(Map m) {final ReentrantLock lock = this.lock;lock.lock();try {// 拷贝一份Map newMap = new HashMap<>(internalMap);newMap.putAll(m);// 设置为新的internalMap = newMap;} finally {lock.unlock();}}@Overridepublic void clear() {final ReentrantLock lock = this.lock;lock.lock();try {internalMap.clear();} finally {lock.unlock();}}@Overridepublic Set keySet() {return internalMap.keySet();}@Overridepublic Collection values() {return internalMap.values();}@Overridepublic Set> entrySet() {return internalMap.entrySet();}}小结这个简易版本的 COW HashMap 只是老马的一个简单实践 , 还有很多可以改进的饿地方 。
各位小伙伴感兴趣的话 , 可以利用 COW 这种思想 , 是想更多属于自己的 COW 集合 。
希望本文对你有帮助 , 如果有其他想法的话 , 也可以评论区和大家分享哦 。
【java 从零手写实现 CopyOnWriteHashMap】各位极客的点赞收藏转发 , 是老马持续写作的最大动力!