文章目录
概括
Java中的锁可以分为多种类别
- 乐观锁/悲观锁
- 独享锁/共享锁
- 互斥锁/读写锁
- 可重入锁
- 公平锁/非公平锁
- 分段锁
- 偏向锁/轻量级
- 自旋锁
以上是一些锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计。
每种锁都有其独特的特点和适用场景。下面将详细介绍每种锁的概念和相应的Java代码示例。
1. 乐观锁/悲观锁
乐观锁与悲观锁并不是特指某两种类型的锁,是人们定义出来的概念或思想,主要是指看待并发同步的角度。
-
乐观锁
获取数据时认为不会被其他线程修改,所以不会上锁,但是在更新的时候会判断其他线程是否修改此数据,如果被其他线程修改,则会发生自旋。
-
悲观锁
总是假设最坏的情况,获取数据时都认为其他线程会修改,因此在获取数据时都会上锁这样保证其他线程需要等待获取锁的线程处理完成并且释放锁。
乐观锁适用于频繁读取的场景,因为不会上锁,因此可以提高吞吐量。在|ava中java.util.concurrent,atomic包下面的原子变量类就是基于乐观锁的一种实现方式CAS(Compare andSwap 比