乐观悲观有内涵概念和外延概念两类
我先说内涵概念
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.
}
}