| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> CAS了解一下 -> 正文阅读 |
|
[Java知识库]CAS了解一下 |
作者:token keyword |
今天咱们还是给自个充充电,就不大战秃头老了!等冲个差不多,电死它! 今天我们就来聊一下CAS,这个玩意,太重要了,是并发包(JUC)的基础,没有它可以说是并发包简直就是废废的,说它之前咱们先讨论一下线程不安全的场景,并尝试解决一下! 目的:怎么让一个变量的快速到达200?
哦?发现用多线程,竟然会造成结果不等于200!(假设A,B线程同时拿到data(100),A快一点,A现在工作内存中改成101,然后写到主内存,然后B开始,先在工作内存改成101,然后在写到主内存101,明明加了两次,但是结果确实101!) 啊!这可怎么办?那肯定就是加锁吧! 方法一:那…
这个确实可以,但是我们都清楚 1、如果根据时间片来获取锁,加锁,释放锁,再加锁,在释放锁,那么就会造成频繁的上下文切换,线程一多,反而多线程的性能可能还不如单线程! 2、一个线程持有锁之后,所有的线程都会被阻塞或者挂起!这不是假多线程嘛! (其实 方法二:
方法三:
方法四:LongAdder(朋友莫慌,后面会介绍)
多线程要保证线程安全可是非常重要的,而且上面的方法多次提到了 先简单介绍下它, 接下来我们说下原理,他又三个参数 我们已经了解了它并且还知道了它的原理,但是大家有没有一种疑惑!假如又两个线程AB,A线程发现 是这样的,自从JNI的出现,我们java也可以越过JVM,调用操作系统原语了,而CAS就是一种系统原语,而系统原语就是属于操作系统原语了,操作系统原语可能是若干条指令,但是一个原语是不能被其他终端打断的,所以并不会出现上面的问题! 最后的最后我们再聊聊 优点:采用无锁的方式,在性能上可能会有不小的提升 缺点:1、会造成ABA问题,2、只能保证一个共享变量(不过可以进行变量合并成对象来玩) 最后的最后的最后在聊聊ABA问题! 臭名昭著的ABA问题,即第一个线程把A把值改成B,然后在改成A,第二个线程发现没有符合期望值,那执行呗! 其实这不完全算问题,有些工作场景并不关心这个,只要最后的值相同就行!比如买了一张火车票,然后秒退,这时候火车票总数不变,不影响!但是有些场景很注重次数,可能这个就很严重了,假如高考试卷,有个人偷偷打开了保险箱,把试题拍了下来,第二个人来的时候是看不出来的,但是这样就造成了泄题! 这时候我们其实加个版本号就行了,每次操作算一个版本,比较值的同时,在比较版本号就行了,具体实现的类有 参考博客:一文彻底搞懂CAS实现原理_东升的思考-CSDN博客 参考博客:CAS是什么?彻底搞懂CAS_阿杰-CSDN博客_cas 以上只是我的简单理解,如果不足之处,请大家指出! |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:07:00- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |