1.乐观锁和悲观锁
如果预测接下来锁冲突的概率不大,就可以少做一点工作,就称为乐观锁
如果预测借来下锁冲突的概率很大,就应该多做一点工作,就成为悲观锁
2.轻量级锁和重量级锁
轻量级锁的开销比较小
重量级锁的开销比较大
3.自旋锁和挂起等待锁
自旋锁属于是一种轻量级锁的典型实现(大多数是用户态实现,比如使用一个while循环,不停的的去检查锁是否被释放,释放了就去获取锁,没有就继续循环)
挂起等待锁,属于重量级锁的一种实现(要借助系统的api去实现,如果出现锁竞争就会在内核当中触发一系列操作,比如说让这个线程进入阻塞的状态,暂时不参与cpu的调度)
4.读写锁
读加锁:读的时候可以读但是不能写
写加锁:写的时候不可以读也不能写
两个线程在加锁的过程中:
(1)读锁和读锁之间不会产生竞争
(2)读锁和写锁之间会产生竞争
(3)写锁和写锁之间也会产生竞争
5.可重入锁和不可重入锁
对于同意一把锁加锁两次不会造成死锁就是可重入锁,如果会造成死锁则是不可重入锁
6.公平锁和非公平锁
当多个线程都尝试获取一把锁时,如果第一个线程释放锁之后,接下来谁来获取到这把锁?
如果是按照先来后到的顺序获取到锁就是公平锁,如果获取锁的机会是均等的则是非公平锁。
举例:
synchronized:
1.乐观锁和悲观锁 2.轻量级锁和重量级锁 3.自旋锁和挂起等待锁
对于以上三种锁,synchronized是自适应的,在实际过程中初始情况下,会预测发生锁冲突的概率不大,此时会以乐观锁(此时是轻量级锁并基于自旋锁的方式实现)的状态运行。
如果发生锁冲突的概率越来越大则synchronized会从乐观锁变成悲观锁(此时是重量级锁,基于挂起等待的方式实现)。
4.读写锁:synchronized不是读写锁
5.可重入锁和不可重入锁:synchronized是可重入锁
6.公平锁和非公平锁;synchronized是非公平锁