锁的分类和应用场景以 Java 中的锁为例,Java 中有种类丰富的锁,每种锁因其特性的不同,在不同的场景下展现出的效率也是参差不齐的。这就需要我们对锁进行合理的分类,放对位置,才能更好地使用锁。

a.线程是否给同步资源加锁?
是:悲观锁。
否:乐观锁。
b.同步资源加锁失败,线程是否需要阻塞?
是:阻塞。
否:不阻塞(自旋锁、适应性自旋锁)。
c.多个线程竞争同步资源的细节区别是?
无锁:不锁住资源,多个线程中只有一个能修改资源成功,其它线程会重试。
偏向锁:同一个线程执行同步资源时自动获取资源。
轻量级锁:多个线程竞争同步资源时,没有获取资源的线程自旋等待锁释放。
重量级锁:多个线程竞争同步资源时,没有获取资源的线程阻塞等待唤醒。
d.多个线程竞争锁时要不要排队?
排队:公平锁。
先尝试插队,插队失败再排队:非公平锁。
e.一个线程中的多个流程能不能获取同一把锁?
能:可重入锁。
不能:非可重入锁。
f.多个线程能否共享一把锁?
能:共享锁。
不能:排他锁
为了方便扣友们理解,下面将以乐观锁和悲观锁为例,简单说下锁的应用场景。