Does java have a “LinkedConcurrentHashMap” data structure?

前端 未结 8 1732
猫巷女王i
猫巷女王i 2020-12-01 07:08

I need a data structure that is a LinkedHashMap and is thread safe.

How can I do that ?

8条回答
  •  没有蜡笔的小新
    2020-12-01 07:58

    I just tried synchronized bounded LRU Map based on insertion order LinkedConcurrentHashMap; with Read/Write Lock for synchronization. So when you are using iterator; you have to acquire WriteLock to avoid ConcurrentModificationException.
    This is better than Collections.synchronizedMap.

    public class LinkedConcurrentHashMap {
    
        private LinkedHashMap linkedHashMap = null;
        private final int cacheSize;  
        private ReadWriteLock readWriteLock = null;
    
        public LinkedConcurrentHashMap(LinkedHashMap psCacheMap, int size) {
            this.linkedHashMap  = psCacheMap;
            cacheSize = size;
            readWriteLock=new ReentrantReadWriteLock();
        }
    
        public void put(K key, V value) throws SQLException{
            Lock writeLock=readWriteLock.writeLock();
            try{
                writeLock.lock();
                if(linkedHashMap.size() >= cacheSize && cacheSize > 0){
                    K oldAgedKey = linkedHashMap.keySet().iterator().next();
                    remove(oldAgedKey);
                }
                linkedHashMap.put(key, value);
            }finally{
                writeLock.unlock();
            }
        }
    
        public V get(K key){
            Lock readLock=readWriteLock.readLock();
            try{
                readLock.lock();
                return linkedHashMap.get(key);
            }finally{
                readLock.unlock();
            }
        }
    
        public boolean containsKey(K key){
            Lock readLock=readWriteLock.readLock();
            try{
                readLock.lock();
                return linkedHashMap.containsKey(key);
            }finally{
                readLock.unlock();
            }
        }
    
        public V remove(K key){
            Lock writeLock=readWriteLock.writeLock();
            try{
                writeLock.lock();
                return linkedHashMap.remove(key);
            }finally{
                writeLock.unlock();
            }
        }
    
        public ReadWriteLock getLock(){
            return readWriteLock;
        }
    
        public Set> entrySet(){
            return linkedHashMap.entrySet();
        }
    }
    

提交回复
热议问题