ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

乐观锁和悲观锁

2021-05-11 16:01:15  阅读:149  来源: 互联网

标签:同步 synchronized CAS age 乐观 线程 悲观 方法


悲观锁

悲观锁就像名字一样,是悲观的状态,认为每次都会有线程来抢资源。

synchronized:

synchronized 是最常用的线程同步手段之一,上面提到的CAS是乐观锁的实现,synchronized就是悲观锁了。

synchronized是java中的关键字,他可以使用在方法上也可以使用在代码块中,用在方法上代表这个方法加锁,不管哪一个线程(例如线程1),运行到这个方法时,都要检查有没有其它线程2(或者3、 4等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程2(或者3 、4)运行完这个方法后再运行此线程1,没有的话,锁定调用者,然后直接运行。

同步方法和同步代码块底层都是通过monitor来实现同步的。

两者的区别:同步方式是通过方法中的access_flags中设置ACC_SYNCHRONIZED标志来实现,同步代码块是通过monitorenter和monitorexit来实现。

我们知道了每个对象都与一个monitor相关联,而monitor可以被线程拥有或释放。

乐观锁 

CAS(Compare And Swap 比较并且替换)是乐观锁的一种实现方式,是一种轻量级锁,JUC 中很多工具类的实现就是基于 CAS 的。

当有多个线程对一个值进行修改时要保证同步问题

比如:如果有一个线程要修改数据库中的字段age,这时会查询数据库中的age字段的值,如果发现age=1,就说明拿到了值,此时要修改这个字段的值把age修改为age=2,在修改之前我们判断一下,原来的age是不是等于1,如果被其他线程修改就会发现age不等于1,我们就不进行操作,如果原来的值还是1,我们就把age修改为2,这就是cas的整个流程。

这里会存在一个问题,就是ABA问题

有三个线程

   线程1拿到了数据1

   线程2拿到了数据2

   线程2通过CAS比较,发现值是1没错,可以把数据1改成数据2

   线程3拿到了数据2

   线程3通过CAS比较,发现数据是2没错,可以把数据2改成了数据1

   线程1通过CAS比较,发现数据还是1没变,就写成了自己要改的值

整个过程好像都是对的,所有的线程都在按部就班的工作,但是最后的值却不是想要得到的值,发生了改变,但是没有线程发现,这种情况虽然不会有什么影响,但是还是存在问题的,还是要把这种问题避免。

如果变成原子操作就不会有问题了:

CAS操作单个共享变量的时候可以保证原子的操作,多个变量就会出现问题, AtomicReference可以用来保证对象之间的原子性,就可以把多个对象放入CAS中操作。

AtomicInteger中有一个自增函数incrementAndGet()就是这样实现的,原理就是使用的循环,直到满足条件才会成功。

循环时间长开销大的问题:

CAS操作长时间不成功的话,会导致一直自旋,就是一直处于循环状态,就导致死循环了,这时CPU的压力会很大。

乐观锁的实践:

在我们的项目中,比如订单,流水等表中,为了解决并发的问题,就会加入CAS的校验,这样就保证了线程的安全,在不同的场景中有不同的使用,不是所有的场景都用相同的方式,所以我们在开发中要根据场景来使用不同的方法保证线程的安全。

ABA问题的解决:

添加版本号 AtomicStampedReference,基础类型简单值不需要版本号。

带版本号就能防止ABA的修改了。

 

标签:同步,synchronized,CAS,age,乐观,线程,悲观,方法
来源: https://www.cnblogs.com/kegongbiji/p/14755811.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有