文档章节

如果理解java中的同步

李雷岗
 李雷岗
发布于 2016/12/09 11:28
字数 661
阅读 34
收藏 0

java的同步说白了就是要保证运行程序的顺序一致性

顺序一致性:顺序一致性模型是被计算机科学家理想化的理论参考模型,为程序员提供了极强的内存可见性保证,两大特性:

  •     一个线程中的所有操作必须按照程序的顺序来执行
  • 不管程序是否同步,所有的线程都只能看到一个单一的操作执行顺序,在顺序一致性内存模型中,每个操作必须是原子执行并且立即对所有的线程可见。   

但是JMM本身没有对多线程下的执行顺序做一致性的保证,在顺序一致性模型中,所有操作完全按照程序顺序串行执行,在JMM中,临界区的代码可以重新排序,单会在临界区的时间点做一些特殊处理,保证虽然在临界区内做了重排序,但是由于监视器的互斥特性,B无法观察到A的重排序,既提高了执行效率,有没有改变执行的结果。

   但是如果没有执行同步操作,JMM不保证执行结果跟顺序一致性模型的结果一样,因为这样的话,就需要禁用大量的处理器和编译器的优化,对执行的性能会产生很大的影响。未同步的程序在顺序一致性模型中,整体是无序的。结果无法预知,保证未同步程序的两个模型的执行结果没什么意义。

如何理解上边这段话呢,我的看法是这样,顺序一致性模型的是理想的模型,但是现实很骨感,如果要做大这种模型,就对于处理器的优化和编译器的优化造成很大的影响,但是如果单单是为了同步这个事儿,把这些优化都给取消掉了的话,得不偿失。这也可以理解成为什么java语言再设计的时候干嘛不直接把这些需要考虑的同步问题都给屏蔽了呢,直接让语言来保证这个,就是因为这涉及到大量的处理器的的指令优化的损失。

    java的同步机制呢,就是设法,在专门对于临界操作的时候呢做一些处理,保证他看着跟顺序一致性水样的但是还不影响大执行的优化,编译器的优化。

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
李雷岗
粉丝 2
博文 34
码字总数 22317
作品 0
昌平
高级程序员
读《深入理解Java虚拟机》- 笔记08

《深入理解Java虚拟机:JVM高级特性与最佳实践》第2版 第10章 早期(编译期)优化 59. 语法糖 在计算机语言中添加某种语法,对语言的功能没有影响,但是方便开发人员使用。 泛型是一种语法糖...

阿历Ali
前天
0
0
通通透透理解ThreadLocal

通通透透理解ThreadLocal 概述 我们知道Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度。这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲...

阿秀a
2010/06/15
0
0
Java并发编程:深入剖析ThreadLocal

想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用...

海子_枫子
2015/07/04
0
0
java类ThreadLocal的理解

ThreadLocal是什么 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更...

保罗的寓言
2011/05/21
0
1
discuz x2.5论坛和其他系统整合反向数据同步问题

最近给客户做一个手机应用,同时需要搭建一个discuz论坛,给用户交流使用。 目前我们称手机应用项目为:java项目,称论坛为discuz项目。 现在客户的需求是主要下面几点: 1.用户使用手机注册...

度外网络
2012/10/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

angular指令监听ng-repeat渲染完成后执行自定义事件方法

今天工作中遇到需要用到ng-repeat遍历渲染完后执行某个操作,angular本身并没有提供监听ng-repeat渲染完成的指令,所以需要自己创建自定义指令。 在ng-repeat模板实例内部会暴露出一些特殊属...

孟飞阳
40分钟前
1
0
URLEncoder和URLDecoder

public static void main(String[] args) { String str1 = "https://test1-life.pingan.com/ilifecore/productMall/loading.html?productId=8000000241&channelCode=XCX00001&productCode=00......

鬼才王
50分钟前
2
0
对象及变量的并发访问-第一篇

方法内部的变量为线程安全变量 “非线程安全”问题存在于“共享变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的。 package chaprer3;/**...

简心
50分钟前
1
0
程序媛眼中的程序猿原来是这样子的!

一直都想写一篇关于描述程序员的文章,但是一直没能开头,一来因为文笔不好,更主要的原因是貌似对程序员既熟悉又不熟悉,很怕写出来的是以偏概全,给大家造成对程序员的既定印象,不过,管他...

Java小铺
今天
1
0
bean标签

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 bean标签 bean标签中的init-method属性,该属性...

凯哥学堂
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部