介绍一下几种典型的锁

3 分钟阅读 525 字 + 250 词
参考答案:
  • 互斥锁 :互斥锁是一种最常见的锁类型,用于实现 互斥访问共享资源 。在任何时刻, 只有一个线程可以持有互斥锁 ,其他线程必须等待直到锁被释放。这确保了同一时间只有一个线程能够访问被保护的资源。对于互斥锁来说,如果获取锁失败,操作系统会将线程阻塞,把线程id记录到和这个锁相关的队列中,等其他线程释放了这个互斥锁,才会通过这个等待队列唤醒休眠线程。
  • 自旋锁 :自旋锁是一种 基于忙等待 的锁,即线程在尝试获取锁时会 不断轮询 ,直到锁被释放,是完全在用户态的,并且一直占用CPU,但是在其他线程很快就释放锁的情况下,效率较高,因为 避免了线程从阻塞态恢复到运行态的这个过程
其他的锁机制都是基于这两个锁的
  • 读写锁: 允许多个线程同时读共享资源,只允许一个线程进行写操作 。分为读(共享)和写(排他)两种状态。
  • 悲观锁:认为 多线程同时修改共享资源的概率比较高,所以访问共享资源时候要上锁
  • 乐观锁:本质上是一种无锁并发控制,先不管, 修改了共享资源再说,如果出现同时修改的情况,再放弃本次操作 ,可以利用CAS和版本号来实现。
总结:
其他的锁都是基于这两个锁的,如果你能确定被锁住的代码执⾏时间很短,就不应该⽤互斥锁,⽽应该选⽤⾃旋锁, 否则使⽤互斥锁。
你会发现 乐观锁 全程并没有加锁,所以它也叫**⽆锁编程**
乐观锁虽然去除了加锁解锁的操作,但是⼀旦发⽣冲突,重试的成本⾮常⾼,所以只有在冲突概率⾮常低,且加锁成本⾮常⾼的场景时,才考虑使⽤乐观锁。