程序中常见锁的定义
悲观锁(Pessimistic Lock):
- 概念:假设会发生并发冲突,因此每次操作时都先锁住资源,阻止其他线程访问。
- 用途:适用于写操作多、冲突频繁的场景,例如数据库中的行锁。
乐观锁(Optimistic Lock):
- 概念:假设不会发生并发冲突,因此不锁定资源,在提交修改时检测是否有冲突。
- 用途:适用于读操作多、冲突较少的场景,例如版本号控制机制。
自旋锁(Spin Lock):
- 概念:线程在获取锁失败时不会阻塞,而是在循环中反复尝试获取锁。
- 用途:适用于锁持有时间短的场景,避免线程切换的开销。
适应性自旋锁(Adaptive Spin Lock):
- 概念:自旋次数是动态调整的,依赖于上一次自旋获取锁的情况。
- 用途:通过自适应调整自旋时间,提高效率。
无锁(Lock-Free):
- 概念:即使多线程竞争,只有一个线程能修改资源成功,其他线程重试。
- 用途:适用于高并发场景,减少锁的使用,提高性能。
偏向锁(Biased Locking):
- 概念:同一个线程执行同步资源时自动获取资源,不需要任何同步操作。
- 用途:适用于线程较少、锁竞争较少的场景。
轻量级锁(Lightweight Lock):
- 概念:多线程竞争锁时没有获取锁的线程自旋等待释放。
- 用途:在锁竞争不激烈时,降低线程切换的开销。
重量级锁(Heavyweight Lock):
- 概念:多线程竞争锁时没有获取锁的线程阻塞等待唤醒。
- 用途:适用于高并发、锁竞争激烈的场景。
公平锁(Fair Lock):
- 概念:线程按照请求锁的顺序排队,先进先出。
- 用途:确保资源分配的公平性,避免线程饥饿。
非公平锁(Non-Fair Lock):
- 概念:线程在获取锁时可以插队,不按顺序排队。
- 用途:在某些情况下提高吞吐量,但可能导致线程饥饿。
可重入锁(Reentrant Lock):
- 概念:同一线程可以多次获取同一把锁,避免死锁。
- 用途:适用于递归调用或需要多次锁定资源的场景。
非可重入锁(Non-Reentrant Lock):
- 概念:同一线程不能多次获取同一把锁,否则会造成死锁。
- 用途:需要严格控制锁的获取次数的场景。
共享锁(Shared Lock):
- 概念:多个线程可以共享同一把锁,用于读操作。
- 用途:适用于多读少写的场景。
排他锁(Exclusive Lock):
- 概念:只有一个线程能持有锁,用于写操作。
- 用途:适用于需要独占资源的场景。