乐观锁、悲观锁

乐观悲观有内涵概念和外延概念两类

我先说内涵概念

cpu是时分复用的

也就是把cpu切片,一片给一个thread/process

片与片之间,需要进行cpu切换

切换涉及到清空寄存器,缓存数据。然后重新加载新的thread所需数据

这个操作必然的会有一定代价

这个一般叫状态切换,碰到需要等待的,就切换出去,到blocking队列,然后等条件具备了,在通过notify()。notifyAll()唤醒回来

那么,悲观锁,其实就是要经过这个过程的锁

在某个资源不可用的时候,就将cpu让出,把当前等待线程切换为blocking状态

等到资源(比如一个共享数据)可用了,那么就将线程唤醒,让他进入runnable状态

等待cpu调度

那么 可以看到,如果一个资源占用时间很短,那么你第一次看,可能这个资源被占用,但当你花费100000个周期切换到blocking的时候,可能立刻就发现自己被唤醒了,于是再花费100000个周期回来抢锁

这个代价明显就高了

于是就产生了乐观锁的概念,他的核心思路就是,我不让出cpu,我while循环1000次,每次2个时钟周期,那么总共我花费了2000个时钟周期,可能就能拿到这个资源

#概数核心是比,你们要分清主次矛盾#

于是,当数据争用不严重,或者入锁处理出锁比较快的时候,乐观锁往往会有更好地效果

内涵概念讲解完毕,再看外延概念

可能由于网络原因,"可以看到,乐观锁的核心是不让出,通过while(true)循环的方式来判断当前锁状况,于是就引申一下, 在各类分布式系统中,“判断某个数据是否能访问,不能访问立刻返回false",通过循环来获得某个资源的访问权限的过程,都被叫做乐观锁了"的消息发送失败。

可能由于网络原因,"对应到Java实现,那么可以认为 tryLock接口是乐观锁实现中的原子接口"的消息发送失败。

有这个外延的原因是,他们实现的方式都一样,类似

while(true)

{

tryLock() == true?

{

       do sth.

}

}
 

猜你喜欢

转载自my.oschina.net/wangen2009/blog/1822847