Collections.synchronizedMap线程安全的map的实现原理

Collections.synchronizedMap线程安全的map的实现原理

  • 背景
    • 学习内容

背景

今天在练习代码时遇到了这样的创建对应的用法,static Map users = Collections.synchronizedMap(new HashMap());
于是想看下这个具体时怎么实现的,就扒着源码瞅了下.

学习内容

按住ctrl点击进去发现它是Collections类中维护的一个静态内部类SynchronizedMap,该内部类中维护了一个普通的map和一个对象排斥锁mutex,如下图:


```java
private final Map m;
final Object mutex;

SynchronizedMap(Map m) {
      this.m = (Map)Objects.requireNonNull(m);
       this.mutex = this;
}

    在new synchronizedMap()的时候,如果传入了mutex参数,则将对象排斥锁赋值为传入的对象;如果没有,则将对象排斥锁赋值为this,即调用synchronizedMap的对象,也就是该例中的users。

    创建出synchronizedMap之后,再操作该map时,就会将方法上锁,实现线程安全,如下图:

```java
public V get(Object key) {
     synchronized(this.mutex) {
         return this.m.get(key);
     }
 }

这只是实现map线程安全的方法之一,以后可以学习点其他方法,对比一下。

另外,Collections类中还有个类似的内部类,SynchronizedSortedMap,它是继承了SynchronizedMap,是有序的map.

你可能感兴趣的:(java基础--集合)