虽然Collections.synchronizedMap和Hashtable并不常用,主要因为某些缺点在并发方面性能极低,比ConcurrentHashMap差远了,但是这里为了出于研究考虑还是稍微看一下底层大概是什么鬼.
1. Collections.synchronizedMap是怎么实现线程安全的
在SynchronizedMap内部维护了一个普通对象Map,还有排斥锁mutex,如图
代码语言:javascript复制Collections.synchronizedMap(new HashMap<>(16));
我们在调用这个方法的时候就需要传入一个Map,可以看到有两个构造器
如果你传入了mutex参数,则将对象排斥锁赋值为传入的对象。 如果没有,则将对象排斥锁赋值为this,即调用synchronizedMap的对象,就是上面的Map(这里锁都被final修饰了,后面也不存在想换就换得可能)。
创建出synchronizedMap之后,再操作map的时候,就会对方法上锁(互斥锁),如图全是