1.乐观锁与悲观锁
乐观锁:
他预测锁冲突的概率不高,如果概率不高的话,我就可以把任务分成多个,在多次加锁解锁过程中完成(每一个加锁解锁时,任务很少 因为已经分成了很多),所以做的事情就会简单一些
悲观锁:
预测锁冲突的概率高,如果还是像乐观锁一样,把任务分成多个的话,因为锁冲突概率高,所以拿到锁不太容易,应该把任务在一次锁里就尽可能完成。所以悲观锁做的事情会复杂一点。
这两个锁是在加锁的过程上看待的,也就是加锁解锁过程中干的事情多还是少
2.轻量级锁与重量级锁
轻量级锁:
加锁解锁的开销小,只是一个纯用户态的加锁逻辑。
重量级锁:
加锁解锁的开销大,因为是一个用户态刀内核态的加锁逻辑
这两个锁是站在加锁的结果上看待的,最终加锁解锁的操作消耗的时间多与少。
3.自旋锁与挂起等待锁
自旋锁:
是轻量级锁的一种体现,它会什么也不做,一直访问当前锁是否已经就绪,消耗大量cpu,这样可以在解锁的时候第一时间确定锁的状态。
挂起等待锁:
是重量级锁的一种体现,它会在锁被占用的时候,去做别的任务,cpu可以去做别的事情,但是就不能第一时间获取到锁的信息了,等的时间可能会长一点,但是cpu做的事情更多了。
4.读写锁与普通互斥锁
普通互斥锁:
如synchronized
当两个线程竞争同一把锁的时候就会阻塞等待。
读写锁:
有两种情况 1.加读锁 给读数据这个操作加锁.2.加写锁,给修改(写)数据这个操作加锁
因为读锁和读锁之间不会有竞争,读锁和写锁,写锁和写锁之间会有竞争,使用读写锁,就会少很多锁竞争,提升效率。
公平锁与非公平锁
公平锁:
1 2 3线程竞争同一把锁,谁先来谁拿到锁。实现公平锁需要引入额外的数据结构。
非公平锁:
1 2 3线程竞争同一把锁,几个线程随机拿到锁,1先来的 但是3拿到了锁,这也是操作系统默认的锁的调度方式。
可重入锁与不可重入锁
可重入锁:
synchronized就是一种可重入锁,同一个线程针对同一把锁,连续加锁两次不会出现死锁
不可重入锁:
同一个线程针对同一把锁,连续加锁两次出现死锁。