码迷,mamicode.com
首页 > 其他好文 > 详细

乐观锁与悲观锁

时间:2018-01-23 15:44:35      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:strong   这一   方式   数据   频繁   16px   自己   进入   并发   

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

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

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

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

上锁。

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

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

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

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

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

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

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

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

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

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

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

MySQL中的乐观锁与悲观锁:

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

访问该区域数据

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

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


乐观锁与悲观锁

标签:strong   这一   方式   数据   频繁   16px   自己   进入   并发   

原文地址:http://blog.51cto.com/12222886/2064222

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!