一、锁基础知识
解决的问题
- 保证一个资源在同一时间只能由一个线程访问或由特定类型的线程访问,即一定程度的互斥性
锁的属性
- 互斥性: 同一时刻只能有一个线程持有锁
- 可重入性: 同一节点上的同一个线程如果获取了锁之后能够再次获取锁
- 锁超时:和J.U.C中的锁一样支持锁超时,防止死锁
- 高性能和高可用: 加锁和解锁需要高效,同时也需要保证高可用,防止分布式锁失效
- 阻塞和非阻塞性:能够及时从阻塞状态中被唤醒
锁的常见分类(依据不同的维度)
- 可重入锁(eg:java中ReentrantLock)
任意线程在获取到锁之后能够再次获取该锁,而不会被该锁所阻塞,该特性的实现需要解决两个问题:- 1)线程再次获取锁:锁需要去识别获取锁的线程是否是当前占据锁的线程,如果是则再次获取锁成功
- 2)锁的最终释放:线程重复n次获取了该锁,随后在第n次释放该锁后,其他线程能够获取到该锁。锁的最终释放要求锁对于获取的次数进行计数自增,计数表示当前锁被重复获取的次数,而锁被释放时,计数自减,当计数为0时表示锁已经成功释放。
- 读写锁(eg: java中的ReadWriteLock)
读写锁将对一个资源的访问分成了2个锁,一个读锁和一个写锁。正因为有了读写锁,才使得多个线程之间的读操作不会发生冲突。 - 乐观锁、悲观锁
乐观锁:认为数据一般情况下的操作不会造成冲突&