Halo
发布于 2022-06-14 / 156 阅读 / 0 评论 / 0 点赞

常见锁

自旋锁

  • 自旋锁是通过 CPU 提供的 CAS 函数(Compare And Swap),在「用户态」完成加锁和解锁操作
  • 竞争资源失败的时候, 会空等待. 空等待一般是通过 while 循环和 PAUSE 指令实现, 线程不会挂起等待
  • CPU 不会切换给其他线程运行

互斥锁

  • 互斥锁是通过 CPU 提供的 CAS 函数(Compare And Swap),在「用户态」完成加锁和解锁操作
  • 竞争资源失败的时候, 会使线程挂起等待
  • CPU 会切换给其他线程运行

读写锁

读写锁适用于能明确区分读操作和写操作的场景
读写锁的工作原理是:

  • 当「写锁」没有被线程持有时,多个线程能够并发地持有读锁,这大大提高了共享资源的访问效率
  • 一旦「写锁」被线程持有后,读线程的获取读锁的操作会被阻塞,而且其他写线程的获取写锁的操作也会被阻塞。

乐观锁与悲观锁

  • 悲观锁做事比较悲观,它认为多线程同时修改共享资源的概率比较高,于是很容易出现冲突,所以访问共享资源前,先要上锁。
  • 乐观锁做事比较乐观,它假定冲突的概率很低,它的工作方式是:先修改完共享资源,再验证这段时间内有没有发生冲突,如果没有其他线程在修改资源,那么操作完成,如果发现有其他线程已经修改过这个资源,就放弃本次操作。

评论