读写锁+HashMap实现线程安全的HashMap
ReadWriteLockCache组合一个非线程安全的HashMap作为缓存的实现,同时使用读写锁的读锁和写锁来保证ReadWriteLockCaChe是线程安全的。
代码:
package concurrency.AQS;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockCache {
public static void main(String[] args) {
ReadWriteLockCache.put("user1", "123");
ReadWriteLockCache.put("user2", "456");
ReadWriteLockCache.put("user3", "789");
for(Entry entry : ReadWriteLockCache.map.entrySet()){
System.out.println(entry.getKey()+":"+entry.getValue());
}
System.out.println("==========================");
ReadWriteLockCache.put("user1", "1233");
for(Entry entry : ReadWriteLockCache.map.entrySet()){
System.out.println(entry.getKey()+":"+entry.getValue());
}
System.out.println("==========================");
System.out.println("user1" + ReadWriteLockCache.get("user1"));
System.out.println("==========================");
ReadWriteLockCache.clear();
for(Entry entry : ReadWriteLockCache.map.entrySet()){
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
static Map<String, Object> map = new HashMap<String, Object>();
static ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
static Lock r = rwl.readLock();
static Lock w = rwl.writeLock();
//获取一个key对应的value
public static final Object get(String key){
r.lock();
try{
return map.get(key);
}finally{
r.unlock();
}
}
//设置key对应的value,并返回旧的value
public static final Object put(String key, Object value){
w.lock();
try{
return map.put(key, value);
}finally{
w.unlock();
}
}
//清空所有内容
public static final void clear(){
w.lock();
try{
map.clear();
}finally{
w.unlock();
}
}
}