Java之通过Collections.synchronizedMap创建线程安全的HashMap

举报
chenyu 发表于 2021/07/26 23:42:12 2021/07/26
4.7k+ 0 0
【摘要】 1 问题 我们知道hashMap线程是不安全的,一般而言,我们怎么创建线程安全的HashMap呢?           2 解决办法 我们可以使用Collections.synchronizedMap来创建HashMap,如下 static Map<String, String> results ...

1 问题

我们知道hashMap线程是不安全的,一般而言,我们怎么创建线程安全的HashMap呢?

2 解决办法

我们可以使用Collections.synchronizedMap来创建HashMap,如下

static Map<String, String> results = Collections.synchronizedMap(new HashMap<String, String>());
 

3 Collections.synchronizedMap源码部分实现

我们先看synchronizedMap如果创建


      public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
      return new SynchronizedMap<K,V>(m);
      }
  
 

我们看下具体的SynchronizedMap类的部分


      private static class SynchronizedMap<K,V>
      implements Map<K,V>, Serializable {
      // use serialVersionUID from JDK 1.2.2 for interoperability
      private static final long serialVersionUID = 1978198479659022715L;
      private final Map<K,V> m; // Backing Map
      final Object mutex; // Object on which to synchronize
       SynchronizedMap(Map<K,V> m) {
      if (m==null)
      throw new NullPointerException();
      this.m = m;
       mutex = this;
       }
       SynchronizedMap(Map<K,V> m, Object mutex) {
      this.m = m;
      this.mutex = mutex;
       }
      public int size() {
      synchronized(mutex) {return m.size();}
       }
      public boolean isEmpty(){
      synchronized(mutex) {return m.isEmpty();}
       }
      public boolean containsKey(Object key) {
      synchronized(mutex) {return m.containsKey(key);}
       }
      public boolean containsValue(Object value){
      synchronized(mutex) {return m.containsValue(value);}
       }
      public V get(Object key) {
      synchronized(mutex) {return m.get(key);}
       }
      public V put(K key, V value) {
      synchronized(mutex) {return m.put(key, value);}
       }
      public V remove(Object key) {
      synchronized(mutex) {return m.remove(key);}
       }
      public void putAll(Map<? extends K, ? extends V> map) {
      synchronized(mutex) {m.putAll(map);}
       }
      public void clear() {
      synchronized(mutex) {m.clear();}
       }
      private transient Set<K> keySet = null;
      private transient Set<Map.Entry<K,V>> entrySet = null;
      private transient Collection<V> values = null;
      public Set<K> keySet() {
      synchronized(mutex) {
      if (keySet==null)
       keySet = new SynchronizedSet<K>(m.keySet(), mutex);
      return keySet;
       }
       }
      public Set<Map.Entry<K,V>> entrySet() {
      synchronized(mutex) {
      if (entrySet==null)
       entrySet = new SynchronizedSet<Map.Entry<K,V>>(m.entrySet(), mutex);
      return entrySet;
       }
       }
      public Collection<V> values() {
      synchronized(mutex) {
      if (values==null)
       values = new SynchronizedCollection<V>(m.values(), mutex);
      return values;
       }
       }
      public boolean equals(Object o) {
      if (this == o)
      return true;
      synchronized(mutex) {return m.equals(o);}
       }
      public int hashCode() {
      synchronized(mutex) {return m.hashCode();}
       }
      public String toString() {
      synchronized(mutex) {return m.toString();}
       }
      private void writeObject(ObjectOutputStream s) throws IOException {
      synchronized(mutex) {s.defaultWriteObject();}
       }
       }
  
 

SynchronizedMap 实现了Map接口的代理类,该类中对Map接口中的方法还是使用synchronized 同步关键字来保证对Map的操作是线程安全的

synchronized(mutex) {/*****/}
 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/103640286

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。