一、乐观锁/悲观锁
乐观锁:我们开发时,默认为乐观锁日常不会更改数据,偶尔更改,那么便会以读为主。 以读为主,那怎么控制同一条数据被重复更改,而且顺序更改呢。 那就有CAS(compare and swith)、这类做法的实现手段为,version、time、或之前拿过来的目标值和要更改数据时的目标值是否是一样。
悲观锁:我们开发时,默认为悲观锁会经常更改数据,为了性能更优,我们会对该代码片段进行上锁。例如我们日常用到的sychornized、ReentrantLock、redislock。
二、公平锁/非公平锁
公平锁就相当于现实中的排队,先来后到;非公平锁就是无秩序,谁抢到是谁的;在reentLock类中公平锁会判断自己是否是在表头,非公平锁则会在执行前判断自己是否能拿到锁。
三、无锁>>偏向锁>>轻量级锁>>重量级锁
synchorized为代表
无锁,自旋锁;
偏向锁,线程id记录到对象头中,假设这个线程后续经常访问这个锁;
轻量级锁,对象先建立一个Lock Record的空间,后续一直CAS进行更新;
重量级锁,线程阻塞被唤醒;
四、可重入锁/不可重入锁
判断锁中的线程是否是当前线程,是当前线程则不锁,从而实现可重入
五、mysql 记录锁、间隙锁、临键锁
记录锁,封锁该行的索引记录;
间隙锁,锁定一段范围内的索引记录;
临键锁,每个数据行上的非唯一索引列上都会存在一把临键锁,锁住左右开闭区间
六、redisson的锁
网上目前资料还没有、并非仔细研读源码。
PS:我们未来的技术知识应当分为,学术研究类型、生产类型、学术辅助生产。网上的知识一知半解,人云亦云。虽然写了这个博客,但心理慌得狠,因为缺乏理论验证环节。先一起学习共勉吧。