前言
在处理并发相关的问题时,我们首先想到的一个解决方案就是给共享的资源加锁,实现同一时刻对同一个资源的互斥访问,本文我们来学习下锁的相关知识。
锁的分类
比如评价一个城市,标准有人口多少、经济发达与否、城市面积大小等,这些都是评价事物的标准,而一个城市可能同时占据多个标准,以北京而言,人口多,经济发达,同时城市面积还很大。
同理,对于 Java 中的锁而言,一把锁也有可能同时占有多个标准,符合多种分类,比如 ReentrantLock 既是可中断锁,又是可重入锁。
根据分类的标准,我们把锁分为7大类,分别是:
- 偏向锁/轻量级锁/重量级锁;
- 可重入锁/非可重入锁;
- 共享锁/独占锁;
- 公平锁/非公平锁;
- 悲观锁/乐观锁;
- 自旋锁/非自旋锁;
- 可中断锁/不可中断锁。
以上是常见的分类标准,下面我们来逐一介绍它们的含义。
偏向锁/轻量级锁/重量级锁
第一种分类是偏向锁/轻量级锁/重量级锁,这三种锁特指 synchronized 锁的状态,通过在对象头中的 mark word 来表明锁的状态。
偏向锁
如果自始至终,对于这把锁都不存在竞争,那么其实就没必要上锁,只需要打个标记就行了,这就是偏向锁的思想。一个对象被初始化后,还没有任何线程来获取它的锁时,那么