浅谈:乐观锁和悲观锁的使用场景

浅谈:乐观锁和悲观锁的使用场景

乐观锁和悲观锁的使用场景

  • 悲观锁:在所有操作前都上锁
  • 乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和 CAS 算法实现。

乐观锁适用于写比较少的情况下(多读场景),即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。

但如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行 retry ,这样反倒是降低了性能,所以一般多写的场景下用悲观锁就比较合适。

死锁的解决方法

死锁的产生是在这样一种环境中:

比如我们有两个进程 AB ,他们都需要资源 1 和资源 2 ,当进程 A 持有资源 1 ,进线程 B 持有资源 2 的时候,他们都需要对方手上的进程,而一般操作系统又不允许抢占,这个时候就发生了死锁。

从这个例子中其实可以总结出死锁的几个必要条件:

1. 一个资源只能被一个进程所占有,不能共享。

2. 一个线程请求资源失败时,它会等待而不是释放。

3. 一个线程在释放资源之前其他进程不能抢夺资源。

4. 循环等待

从死锁产生的原因未明可以设计一些方法去避免死锁的发生:

(1)静态分配资源,一开始就把一个进程所需的全部资源都分配给它,但这样会降低资源的使用效率。

(2)允许抢占,需要设置进程的不同优先级,高优先级的进程可以抢占低优先级的进程的资源。

(3)把资源进行编号,申请资源必须按照资源的编号顺序来申请。

如果死锁已经发生了,就需要去解开死锁,其本质思想就是分配资源打破循环等待。

(1)可以运行抢占,从一个或多个进程中抢出资源来给其他进程。

(2)也可以终止一些进程,来达到释放资源的目的。