问题:SynchronizedMap如何让HashMap具备线程安全

1. 首先利用SynchronizedMap的构造函数获取map的对象,而该构造器可以传入一个HashMap的集合作为参数

2. SynchronizedMap底层通过一个互斥信号量mutex(final Object) 进行方法同步的限定,

synchronized(mutex)进行加锁,达到线程同步的效果,如下源码所示

        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);}  
        }    

3.使用方式:

    Map<String,Long> user = Collections.synchronizedMap(new HashMap<>());
    user.put("xsj",1234567l);
    System.out.println(user.get("xsj"));