数据类型
Collection类
写-行锁
写操作使用行锁,用于对一个Key加锁,保证同一时间只有一个线程对一个Key进行写操作。
读-无锁
Collection类的写操作都为原子性操作,读操作时无需加锁。
Key-Value
写-分段锁
Key-Value 使用分段锁,通过Key的HashCode进行分段,最多支持锁Size(默认128)个线程同时对整个Key-Value同时进行写操作
读-无锁
Key-Value的写操作都为原子性操作,所以读操作时无需加锁
SeqList
写-特殊行锁
SeqList 写操作使用行锁,用于对一个key加锁。
但是SeqList的锁机制比较特殊:采用先申请顺序,再写入的方式。对于单个Key,在申请顺序时加锁,写入时无锁,以达到最高的写入性能
读-无锁
SeqList的写操作都为原子性操作,读操作时无需加锁
锁类型
分段锁
分段锁,通过Key的HashCode进行分段,最多支持锁Size个线程同时对整个Key-Value同时进行写操作
应用
K-V结构的写操作使用了分段锁
双层锁
特性
由一层分段锁和一层Key缓存锁组成,可为每个Key分配独立的锁,来保证每次访问key的线程只有一个。通过内部的实现机制,可以保证锁不会频繁的创建销毁的同时,可以控制同时存在在内存中锁的数量。
分段锁
在获取缓存中key锁、创建key锁、key锁加入缓存时使用、清除缓存中的key锁时,代替ReentrantLock或者synchronized,增强代码块需要锁时的并发处理能力。
Key缓存锁
为每个Key独立分配锁,保证不同key所对应的数据完全独立。在释放锁时,此锁并不会被立刻销毁,而是暂时存于缓冲中。只有在如下条件成立时,锁才会被销毁:
- 在所有线程都访问结束的前提条件下
- 当前缓存中存在的锁的数量大于最大缓存数的4倍,锁会被立刻销毁
- 当前缓存中存在的锁的数量大于最大缓存数,锁的最后一次使用时间超过过期时间,锁会被定时清理器销毁
应用
双层锁 用于Collection类的行锁。Collection类中,不同key所对应的数据完全独立,所以只需要对key加锁可以保证数据在并发访问时的一致性,行锁相对来说,锁定粒度小,也可以保证数据访问的高效性。