- 互斥锁:互斥锁是一种最常见的锁类型,用于实现互斥访问共享资源。在任何时刻,只有一个线程可以持有互斥锁,其他线程必须等待直到锁被释放。这确保了同一时间只有一个线程能够访问被保护的资源。
- 自旋锁:自旋锁是一种同步机制,用于在多线程环境中保护共享资源的访问。它是一种轻量级的锁,其核心思想是当一个线程尝试获取锁时,如果锁已经被其他线程持有,那么它会不断地循环检查锁的状态,直到锁被释放。
其他的锁都是基于这两个锁的
- 读写锁:用于控制对共享资源的并发访问,特别是当资源被频繁读取但较少修改时。读写锁允许多个读操作同时进行,但写操作是排他的,即在写操作时不允许其他读或写操作。根据实现,读写锁可以是写优先(写操作优先级更高)或读优先(读操作优先级更高)。在某些实现中,为了防止写操作饿死,当有写请求时,系统可能会暂时阻止新的读请求获得锁。
- 悲观锁:悲观锁,顾名思义,采取的是一种悲观的态度,它假设在访问共享资源时,冲突是常见的。因此,悲观锁会通过锁定资源来确保数据的一致性。在访问资源前,悲观锁会尝试获取一个排他锁(exclusive lock),如果获取成功,则可以安全地访问资源;如果失败,则等待直到锁被释放。
- 乐观锁:乐观锁采取的是一种乐观的态度,它假设在访问共享资源时,冲突是少见的。乐观锁通常通过记录资源的版本号或时间戳来实现。每个资源都有一个版本号,当读取资源时记录下版本号,当提交更新时检查版本号是否发生变化。如果未变化,则更新资源并增加版本号;如果变化了,则意味着有其他线程已经修改了资源,当前操作需要重试或回滚。