Skip to main content

常见锁机制

· 9 min read
Czasg

常见锁机制有:

  • 互斥锁(Mutex)
  • 读写锁(Read-Write Lock)
  • 自旋锁(Spin Lock)
  • 屏障(Barrier)
  • 原子操作(Atomic Operations)
  • 分布式锁(Distributed Lock)

互斥锁

互斥锁是最常见的锁机制之一。它允许只有一个线程或进程可以访问共享资源,其他线程或进程必须等待锁的释放才能访问。 互斥锁提供了最基本的线程同步机制,但如果不慎使用不当,可能会导致死锁问题。

读写锁

读写锁允许多个线程同时读取共享资源,但只有一个线程能够写入。这提高了读取操作的并发性能,但写入操作仍然是互斥的。

自旋锁

自旋锁(Spin Lock)是一种锁机制,它在尝试获取锁时不会阻塞线程,而是会一直尝试获取锁,如果锁已经被其他线程占用,它会一直忙等(自旋),直到锁变为可用状态。自旋锁的原理可以简单理解为以下几点:

  1. 无阻塞等待:自旋锁不会将线程挂起或阻塞,线程会一直尝试获取锁。因此,它适用于短期内锁被占用的情况,以减少线程切换的开销。

  2. 忙等待:自旋锁会让线程忙等,也就是不停地检查锁是否可用。这会消耗CPU资源,因此不适用于长时间的等待。

  3. 原子操作:为了确保线程在竞争锁时不会产生竞态条件,自旋锁通常使用原子操作来更新锁的状态。原子操作能够保证在多线程环境下的原子性。

  4. 公平性:自旋锁通常是非公平的,它不考虑等待时间,只要锁可用就立即获取,不考虑其他线程是否在等待。

使用场景:自旋锁在多核CPU上的性能较好,因为它可以减少线程切换的开销。但在单核CPU上使用自旋锁可能会导致性能下降,因为它会占用CPU时间。

自旋锁的适用场景通常是短期内锁的争用较小的情况,例如在多线程环境下对一些共享资源进行读写操作,或者在初始化阶段的互斥访问。在长时间的等待或大量线程争用的情况下,自旋锁可能不是最佳选择,因为它会浪费大量的CPU时间。

需要谨慎使用自旋锁,确保它在特定的场景中能够提供性能优势,同时避免忙等待时间过长导致的性能问题。

屏障

屏障(Barrier)是一种同步机制,用于协调多个线程的执行,确保它们在特定点上等待彼此完成,然后再一起继续执行。理解屏障的原理可以分为以下几个关键概念:

  1. 同步点:屏障通常在代码中的某个特定位置设置,这个位置被称为同步点。在同步点之前的线程会等待,直到所有线程都到达同步点才会继续执行。同步点可以用来确保多个线程在某个特定的执行阶段或时间点上进行同步。

  2. 等待和唤醒:线程在达到屏障之前会等待,一旦所有线程都到达屏障,屏障会唤醒这些线程,使它们可以继续执行。屏障的等待和唤醒通常是由一个计数器来管理的,每个线程到达屏障时会将计数器减一,直到计数器减为零时,所有线程都被唤醒。

  3. 线程协调:屏障用于协调多个线程的执行,确保它们在某个关键点上进行同步。这对于某些并发算法和多线程编程场景非常有用,例如并行计算、多阶段任务的协同工作等。

  4. 阻塞和解除阻塞:在达到屏障之前,线程会被阻塞,无法继续执行。一旦所有线程都到达屏障,屏障将被解除,所有线程都可以继续执行。

  5. 使用场景:屏障通常用于多线程协作的场景,例如在并行计算中,多个线程分别执行不同的计算任务,然后在某个阶段需要合并它们的计算结果,这时可以使用屏障等待所有线程完成各自的计算任务,然后再继续下一阶段的操作。

总之,屏障是一种同步机制,它用于协调多个线程在某个同步点上的等待和继续执行,以确保线程之间的协同工作和同步。屏障的原理包括等待、唤醒、计数器管理等机制,它在多线程编程和并发算法中发挥着重要作用。

原子操作

原子操作是一种不需要显式锁的同步机制,它通过硬件支持的原子操作指令来确保对共享资源的原子访问。

CAS(Compare-And-Swap)是一种并发编程中常用的原子操作机制,用于实现多线程或多进程环境下的原子操作。 CAS操作是一种乐观锁(optimistic locking)的方式,其基本思想是:

  1. 首先,读取共享变量的当前值。
  2. 然后,与预期的旧值进行比较。
  3. 如果当前值等于预期的旧值,就将新值写入共享变量;否则,认为操作失败,不进行写入。
  4. 最后,无论是否写入成功,都会返回操作之前的当前值。

CAS操作的关键在于,它在操作共享变量时,不使用传统的加锁机制,而是通过比较当前值和预期的旧值, 来确定是否可以进行更新操作。这使得CAS操作可以在多线程环境下确保原子性,而无需显式锁定共享资源。

分布式锁

分布式锁用于多个计算节点之间的同步,以确保在分布式系统中的共享资源或临界区的互斥访问。


👇👇👇

本文作者: Czasg 版权声明: 转载请注明出处哦~👮‍