锁升级
锁升级是发生在运行时期机制,当没有进行线程任务时最开始状态是无锁状态,当线程执行任务时变成偏向锁,此时偏向锁并没有真正的加锁而是对该做个标记,当有其他线程竞争时标记检测到,此时第一个线程立即将锁装换成轻量级锁并且拿到锁,当竞争激烈时,转换成重量级锁。
锁消除
非必要不加锁,发生在编译时期做的优化手段,检测当前代码是否是多线程执行/是否有必要加锁,若没必要则自动将锁去掉。
锁粗化
锁粗化:指的是锁的粒度,synchronized代码块,包含代码多少,代码越多,粒度越粗,代码越少粒度越小(串行代码少,并发执行代码多),但是如果某个场景要频繁加锁解锁,就将他转换成一个更粗粒度的锁。
HashTable和ConcurrentHashMap的区别
- HashTable和ConcurrentHashMap都是线程安全的
- 加锁粒度不同,HashTable针对整个哈希表加锁,任何的增删查改都要加锁,也都可能发生锁竞争,而ConcurrentHashMap是针对哈希表中每个链表进行加锁,此时就导致加锁操作发生锁冲突概率变小。
- ConcurrentHashMap更充分的利用了CAS机制,比如更新元素个数就可以直接使用CAS完成,不必加锁。
- 对于HashTable进行扩容时是一次性进行搬运元素,当有很多数据时,进行put发生扩容会非常卡顿,而ConcurrentHashMap并不会把所有元素进行一次性搬运,而是每次操作过程中进行搬运(增删查,删除元素看元素在哪删除那个表,查找,新表旧表都查)。