JMM内存模型,JVM分配策略,Volatile+AtomicXXX实现同步

为了深入理解CAS的,我们从以下几个维度去探究CAS,然后再去考虑为什么出现ABA问题。

1、CAS是什么?
2、为什么需要CAS算法?
3、CAS解决的是什么问题?
4、在jdk中有哪些是基于CAS实现的?
5、CAS底层实现原理是什么?
6、如何自己编写一个类似CAS算法的实现【简单版本】
7、CAS有哪些问题?
8、CAS的ABA问题到底是什么意思?如何解决ABA问题?

CAS是什么?

CAS:一个算法,全称为Compare And Swap,比较且交换。在CAS中存在三个值,
V:内存值
A:旧值或者叫预期值
B:更新值
当且仅当A==V (预期值==内存值),才会出现V=B,将更新值赋给内存值,否则什么都不做。
问题:为什么需要CAS算法,到底CAS在做什么?三个值分别是什么意思?
接下来我们通过一个个的测试用例去探究CAS:

测试用例1

在多线程情景下:

多线程情景下修改值

结果:

多线程情景下修改值

结论:在多线程下,无法通过主线程改变其他线程中的内容。

探究原因:

  • java内存模型(JMM:java memory mode)
  • 多线程下如何处理共享数据?


    Java内存模型

Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样底层细节。此处的变量与Java编程时所说的变量不一样,指包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,后者是线程私有的,不会被共享。
Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成。

注意:这里的主内存、工作内存与Java内存区域的Java堆、栈、方法区不是同一层次内存划分,这两者基本上没有关系

测试用例2:解决可见性问题

解决方案:通过在共享变量上加入volatile关键词。volatile关键词只能保证内存可见性,而不能保证原子性。 【ps,关于volatile我们这次不做探究,当然这里除了这种方式之外还有其他解决办法,我们也暂且先不做深入】

加入volatile测试代码:

volatile测试代码

结果:

测试结果

测试用例3:测试原子性问题

测试用例3:测试原子性问题

结果:

测试结果

问题: 通过volatile不能保证我们原来数据的原子性问题,继续往下深入

测试用例4:解决原子性问题

测试用例4:解决原子性问题

注意这里的标注区域,通过AtomicInteger保证原子性

结果:

测试结果

解决方案:通过使用java.util.concurrent.atomic.AtomicInteger帮助我们解决原子性问题,而截至到这里我们才真正意义上准备接触CAS算法。这里对于AtomicXXX 不多做扩展,我们回来继续了解CAS。

CAS解决了什么问题?

CAS帮助我们解决了数据一致性问题,或者是在上述的例子中,我们通过AtomicXXX类确保数据的原
子性。这里的数据一致性我们已经在多线程情景下去模拟过了。
并且在高并发CAS算法也能帮助我们很好的处理数据一致性问题,且它的实现是一种基于乐观锁的
策略实现。这样要比直接使用Synchronized要来的更加高效,但是这里注意CAS本身的算法
实现我们说是不稳定的由于这个问题也出现了我们说的ABA问题。

在jdk中有哪些是基于CAS实现的?

java.utit.concurrent.*;就是基于CAS算法实现的。没有CAS就没有这个包;
PS:深入扩展一下,比如jvm对于对象分配时也会使用CAS算法。

java堆中的内存分配【这里简单扩展】

我们都知道当执行new操作的时候,此时其实对象在堆中分配大小的空间是已经确定了的,因为我们
知道java是强类型语言。不同数据类型在堆中所占空间时确定的。
那么当空间确定之后jvm到底是如何分配的呢?

内存分配策略:

单线程分配策略

指针碰撞

一般适用于内存绝对规整的[内存是否规整取决于回收策略],分配空间时只是通过指针向空闲内存中移动创建对象大小的位置即可。

空闲列表

一般适用于内存非规整的,此时jvm内部维护了一个列表[内存列表]。这个列表中记录哪些空间时空闲的。分配空间时会在这个列表中查看,找寻合适的区域,然后进行使用。

多线程分配策略

ps:给一个对象分配空间时,其实不是原子操作的,需要一下几步:

  • 查找空闲列表(这里我们假设大多数情况下内存都是非规整的以示一般性)
  • 分配内存
  • 修改内存列表 等操作

第一种多线程分配策略:CAS

jvm通过cas和失败重试机制保证分配内存之后的更新等操作的原子性。

第二种多线程分配策略:TLAB

每个线程会在java堆中分配一个内存[这个内存比较小],这个内存称之为本地线程分配缓冲区[TLAB],线程内部如果需要分配内存会首先在这个TALB上分配,避免线程冲突,只有缓冲区用完之后才会在分配内存时通过CAS操作分配更大的内存空间。jdk1.5之后默认开启TLAB,当然可以手动关闭:-xx:+/-UseTLAB进行配置。

我们正在这里先讨论到这里,下次继续补齐剩余内容,当然在以上内容中我们有抛出了一些新的问题:

  • volatile关键词的同步机制 有哪些优缺点呢?
  • java中的悲观锁除了Synchronized之外还有哪些?
  • 乐观锁的实现机制是什么?
  • 线程同步策略有哪些?

以上内容我们后续在继续攻破!!!嘿嘿,奸计得逞,你以为你学会了一个东西,其实你是踩到坑里了,哈哈。请叫我坑王。最后以上内容中可能有不详之处,大家观看时一定要存疑

书上、别人的不一定是对的,自己测试才能测出真理。

实践是检验真理的的唯一途径

下篇内容地址://www.greatytc.com/p/fbab74f4fa74

版权声明:本文为原创文章,未经博主允许不责转载。
原文地址://www.greatytc.com/p/15f17da87ba6

参考文档:

https://blog.csdn.net/u010425776/article/details/51192448

http://ifeve.com/atomic-operation/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,565评论 6 539
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,115评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,577评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,514评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,234评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,621评论 1 326
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,641评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,822评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,380评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,128评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,319评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,879评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,548评论 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,970评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,229评论 1 291
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,048评论 3 397
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,285评论 2 376

推荐阅读更多精彩内容