目录
一、众所周知,HashMap是线程不安全的
我们可以选择ConcurrentHashMap
二、如果没有ConcurrentHashMap
,如何保证HashMap是线程安全的
可以利用读写锁来保证其线程安全性,同时提供不错的吞吐量和并发性。
package com.miller.datastructure.readwrite;
import java.util.HashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* @program: data-structure
* @description: 使用读写锁确保一个非线程安全的HashMap安全操作
* @author: Miller.FAN(振彪)
* @create: 2021-01-14 15:05
**/
public class Cache {
static HashMap<String,Object> map = new HashMap<String,Object>();
static ReentrantReadWriteLock rw = new ReentrantReadWriteLock();
static Lock r = rw.readLock();
static Lock w = rw.writeLock();
//读
public static final Object get(String key) {
r.tryLock();
try {
return map.get(key);
}finally {
r.unlock();
}
}
//写
public static final void put(String key, Object o) {
w.lock();
try {
map.put(key,o);
}finally {
w.unlock();
}
}
//清空所有的内容
public static final void clear() {
w.lock();
try {
map.clear();
}finally {
w.unlock();
}
}
}
三、使用读写锁的好处
1、读写锁能够简化读写交互场景的编程方式
2、读写锁与排它锁比较,具有更好的并发性和吞吐量;
3、保证写操作对读操作的可见性。