自旋锁
- 自旋锁是通过 CPU 提供的 CAS 函数(Compare And Swap),在「用户态」完成加锁和解锁操作
- 竞争资源失败的时候, 会空等待. 空等待一般是通过 while 循环和 PAUSE 指令实现, 线程不会挂起等待
- CPU 不会切换给其他线程运行
互斥锁
- 互斥锁是通过 CPU 提供的 CAS 函数(Compare And Swap),在「用户态」完成加锁和解锁操作
- 竞争资源失败的时候, 会使线程挂起等待
- CPU 会切换给其他线程运行
读写锁
读写锁适用于能明确区分读操作和写操作的场景
读写锁的工作原理是:
- 当「写锁」没有被线程持有时,多个线程能够并发地持有读锁,这大大提高了共享资源的访问效率
- 一旦「写锁」被线程持有后,读线程的获取读锁的操作会被阻塞,而且其他写线程的获取写锁的操作也会被阻塞。
乐观锁与悲观锁
- 悲观锁做事比较悲观,它认为多线程同时修改共享资源的概率比较高,于是很容易出现冲突,所以访问共享资源前,先要上锁。
- 乐观锁做事比较乐观,它假定冲突的概率很低,它的工作方式是:先修改完共享资源,再验证这段时间内有没有发生冲突,如果没有其他线程在修改资源,那么操作完成,如果发现有其他线程已经修改过这个资源,就放弃本次操作。