原子性,可见性和有序性

Java的内存模型是围绕着在并发过程之中如何处理原子性,可见性和有序性这三个特征来建立的。

原子性

由java内存模型来直接保证的原子性变量操作包括read,load,assign,use,store,write,我们大致可以认为基本数据类型的访问读写是具备原子性的(例外就是long和double的非原子协定),如果应用场景需要一个更大范围的原子性保证,java内存模型还提供了lock和unlock的操作来满足这种需求,尽管jvm把lock操作和unlock操作直接开放给用户,但是却提供了更高层次的字节码指令monitorenter
monitorexit来隐式地使用这两个操作,这两个字节码指令反映到java代码之中就是同步块(synchronized),所以在synchronized块之间的操作也是具备有原子性的。

可见性

可见性是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方式来实现可见性的,无论普通变量还是volatile变量都是如此,普通变量与volatile变量的区别在于:volatile的特殊规则保证了新值能立即同步回主内存,以及每次使用前立即从主内存刷新。因此,volatile保证了多线程操作时变量的可见性,而普通变量则不能保证。

除了volatile,java中还有synchronizedfinal关键字能实现可见性。synchronized的可见性是由于“对于一个变量执行unlock操作之前,必须先把此变量同步回主内存中”;而对于final关键字的可见性来说:被final关键字修饰的字段在构造器之中一旦初始化完成,并且构造器没有吧this的引用传递出去,那么其他线程中就能看到final字段的值。

有序性

java程序中天然的有效性可以总结为一句话:如果在本线程内观察,所有的操作都是有序的;(线程内表现为串行的语义)如果在一个线程中观察另外一个线程,所有的操作都是无序的。(指令重排序现象和工作内存与主内存同步延迟现象)。
java提供了volatilesynchronized两个关键字来保证线程之间的操作的有序性,volatile关键字本身就包含了禁止指令重排序的语义,而synchronized关键字则是由“一个变量在同一时刻只允许一条线程对其进行lock操作”这条规则获取的,这条规则决定了持有同一个锁的两个同步块只能串行地进入。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,367评论 11 349
  • 1、原子性(Atomicity)原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执...
    福later阅读 455评论 0 0
  • 丙申年七月十八,我背着牛仔背包,扣上矮门,转身。邻居家的仅剩的那只母鸡来为我送行,她欲言又止。 狗儿跑,公鸡叫,喜...
    陈小一杂货铺阅读 312评论 1 1
  • 昨天下午去推罐,躺在床上,推的地方很疼,还推了头,头部反射区有的地方很疼,有火。哪来这么多火?一个人,为啥不能开开...
    天使的自由阅读 152评论 0 0