您的位置:首页 > 其它

乐观锁与悲观锁

2018-01-23 14:25 351 查看
乐观锁与悲观锁其实是一种编程观念的不同,一种观念乐观,一种悲观。。。(。。。)
悲观锁:当线程准备进入一个临界区时,回悲观的认为,自己在执行过程中,肯定会被其他线程干扰,于是
当它进入临界区之后会立即上锁,是后续来的线程都阻塞。
乐观锁:当线程准备进入一个临界区时,会乐观的认为,我执行的时候不会有其他线程的影响,因此,没必要
上锁。
Java线程中的乐观锁与悲观锁:

synchronized就是一个典型的悲观锁,当锁被一个线程占用的时候,其他需要此锁的线程就会
被阻塞,那么在高并发的情形下,多条线程的阻塞会引起CPU频繁的切换线程上下文,拖慢系统性能。(此处的锁
是基于JVM的规范的,JVM规定每一个对象都与一个监听器对象monitor对应,且一个监听器对象只能被一个线程
持有,自此便有了神奇的synchronized同步了)
lock是一个乐观锁的实现,当线程进入一临界区时,他会认为没有其他线程的干扰,因此它不会上锁,

那么有人会问,你不上锁那岂不是会出现线程安全问题???的确是会出现的,但我们可以用代码解决这个问题,
自旋+CAS操作便easy的解决了这个问题。假如现在有十条线程同时访问一个临界区,由于CAS的存在,在一趟
执行过程中,只会有一个线程执行成功,其他线程都会失败而进入自旋,即重新执行刚才的代码,由于自旋,
这十条线程总会有执行完成的时候。(CAS机制是一种基于指令操作的方式,他可以保证某一个操作的原子性,
既保证上面所说的只有一个线程可以执行成功。自旋即for(;;))
MySQL中的乐观锁与悲观锁:
悲观锁:即排它锁,当事物操作这一部分数据时,会被锁定,只有当操作结束,其它事物才可以
访问该区域数据
乐观锁:事物操作数据时,不会锁定,只是提交更新时会判断数据有没有被其它事物更新,如果没更新

就提交更新,否则拒绝更新,让用户重新操作(类似于CAS)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  乐观锁 悲观锁