乐观锁与悲观锁

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了乐观锁与悲观锁相关的知识,希望对你有一定的参考价值。

    乐观锁与悲观锁其实是一种编程观念的不同,一种观念乐观,一种悲观。。。(。。。)

悲观锁:当线程准备进入一个临界区时,回悲观的认为,自己在执行过程中,肯定会被其他线程干扰,于是

当它进入临界区之后会立即上锁,是后续来的线程都阻塞。

乐观锁:当线程准备进入一个临界区时,会乐观的认为,我执行的时候不会有其他线程的影响,因此,没必要

上锁。

Java线程中的乐观锁与悲观锁:

    synchronized就是一个典型的悲观锁,当锁被一个线程占用的时候,其他需要此锁的线程就会

被阻塞,那么在高并发的情形下,多条线程的阻塞会引起CPU频繁的切换线程上下文,拖慢系统性能。(此处的锁

是基于JVM的规范的,JVM规定每一个对象都与一个监听器对象monitor对应,且一个监听器对象只能被一个线程

持有,自此便有了神奇的synchronized同步了)

    lock是一个乐观锁的实现,当线程进入一临界区时,他会认为没有其他线程的干扰,因此它不会上锁,

那么有人会问,你不上锁那岂不是会出现线程安全问题???的确是会出现的,但我们可以用代码解决这个问题,

自旋+CAS操作便easy的解决了这个问题。假如现在有十条线程同时访问一个临界区,由于CAS的存在,在一趟

执行过程中,只会有一个线程执行成功,其他线程都会失败而进入自旋,即重新执行刚才的代码,由于自旋,

这十条线程总会有执行完成的时候。(CAS机制是一种基于指令操作的方式,他可以保证某一个操作的原子性,

既保证上面所说的只有一个线程可以执行成功。自旋即for(;;))

MySQL中的乐观锁与悲观锁:

    悲观锁:即排它锁,当事物操作这一部分数据时,会被锁定,只有当操作结束,其它事物才可以

访问该区域数据

       乐观锁:事物操作数据时,不会锁定,只是提交更新时会判断数据有没有被其它事物更新,如果没更新

就提交更新,否则拒绝更新,让用户重新操作(类似于CAS)


以上是关于乐观锁与悲观锁的主要内容,如果未能解决你的问题,请参考以下文章

面试必备----------------乐观锁与悲观锁

[初级]深入理解乐观锁与悲观锁

MYSQL悲观锁与乐观锁

乐观锁与悲观锁

乐观锁与悲观锁

悲观锁与乐观锁