concurrentHashMap默认实现了线程安全性
在JDK1.7及之前的版本,使用的是分段锁
会将一个大数组 数组[0-7],拆分成多个小数组 数组[0-3] 数组[4-7] --> 每个数组对应一个锁
不同的线程请求过来,线程1要put的位置是 数组[1],线程2要put的位置是 数组[4],所以线程1和线程2分别属于不同的锁,它们之间互不影响
在JDK1.8及之后,做了一些优化,进行锁粒度的细化
[一个数组],数组里每个元素进行put操作,都是有一个不同的锁,刚开始进行put操作的时候,如果两个线程都是在 数组[1]的位置进行put操作,这个时候采用的CAS的策略
同一时间,只能有一个线程能成功执行这个CAS,就是说刚开始先获取这个 数组[1] 这个位置的值,如果数组[1]的位置为null,线程1进行CAS的比较,put对应的数据,同时间,其它的线程执行CAS,都会失败
分段加锁,通过对数组的每个元素执行CAS的策略,如果多个线程对数组的不同元素执行put操作,互相是不受影响的
如果put操作发现数组[1]的位置有元素了,那么这个位置会基于链表+红黑树进行处理,synchronized(数组[1])进行加锁,基于链表或者红黑树在这个位置put进去自己的数据
总结:
如果你是对数组的同一位置的元素进行操作,才会加锁串行化处理;如果是对数组的不同位置的元素操作,此时大家是可以并行处理的