zoukankan      html  css  js  c++  java
  • [java] 简单的ConcurrentHashMap

    ConcurrentMap和Guava的LocalCache实现原理相近,底层的存储方式使用的时table方式来存储。这里使用最简单且最暴力的方式,在每次访问的时候均加锁。

    ConcurrentHashMap接口:

    public interface ConcurrentHashMap<K, V> {
    
        public V get(K k);
    
        public void put(K key, V value);
    
        public void putAll(Iterable<MapEntry<K, V>> kIterator);
    
        public V remove(K k);
    }
    

      MapEntry:

    public class MapEntry<K, V> {
    
        private K key;
    
        private V value;
    
        public K getKey() {
            return key;
        }
    
        public void setKey(K key) {
            this.key = key;
        }
    
        public V getValue() {
            return value;
        }
    
        public void setValue(V value) {
            this.value = value;
        }
    }
    

      SimpleConcurrentHashMap接口:

    import com.google.common.base.Preconditions;
    import com.google.common.collect.Maps;
    
    import java.util.HashMap;
    import java.util.Iterator;
    
    public class SimpleConcurrentHashMap<K, V> implements ConcurrentHashMap<K, V> {
    
        private final HashMap<K, V> cache = Maps.newHashMap();
    
        public SimpleConcurrentHashMap() {
        }
    
        @Override
        public V get(K k) {
            Preconditions.checkNotNull(k);
            synchronized (cache) {
                return cache.get(k);
            }
        }
    
        @Override
        public void put(K key, V value) {
            Preconditions.checkNotNull(key);
            Preconditions.checkNotNull(value);
            synchronized (cache) {
                cache.put(key, value);
            }
        }
    
        @Override
        public void putAll(Iterable<MapEntry<K, V>> entryIterable) {
            Preconditions.checkNotNull(entryIterable);
            Iterator<MapEntry<K, V>> iterator = entryIterable.iterator();
            while (iterator.hasNext()) {
                MapEntry<K, V> next = iterator.next();
                this.put(next.getKey(), next.getValue());
            }
        }
    
        @Override
        public V remove(K k) {
            Preconditions.checkNotNull(k);
            synchronized (cache) {
                return cache.remove(k);
            }
        }
    }
    

      

  • 相关阅读:
    Mac上Homebrew的安装
    Nodejs全局/缓存路径配置
    Windows 10文件夹Shirt+鼠标右键出现“在此处打开命令窗口”
    CentOS 7上VNCServer的安装使用
    照葫芦画瓢系列之Java --- eclipse下使用maven创建Struts 2项目
    照葫芦画瓢系列之Java --- Maven的集成和使用
    关于集合常见面试问题
    Linux 性能分析大概步骤
    java中的scanner用法
    分享一个内存溢出的问题
  • 原文地址:https://www.cnblogs.com/life91/p/4676626.html
Copyright © 2011-2022 走看看