为了账号安全,请及时绑定邮箱和手机立即绑定

乐观锁与悲观锁

标签:
Java

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

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

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

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

上锁。

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

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

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

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

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

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

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

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

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

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

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

MySQL中的乐观锁与悲观锁:

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

访问该区域数据

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

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


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消