程序中常见锁的定义

Last modified date

悲观锁(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)

  • 概念:只有一个线程能持有锁,用于写操作。
  • 用途:适用于需要独占资源的场景。

淋雨