victory的博客

长安一片月,万户捣衣声

0%

锁 | 读写锁+HashMap实现线程安全的HashMap

读写锁+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();
        }
    }
}