数据类型

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加锁可以保证数据在并发访问时的一致性,行锁相对来说,锁定粒度小,也可以保证数据访问的高效性。