文档章节

如果理解java中的同步

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

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

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

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

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

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

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

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

 

 

 

 

 

© 著作权归作者所有

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

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

阿历Ali
08/18
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

没有更多内容

加载失败,请刷新页面

加载更多

LINUX中如何查看某个端口是否被占用(转发)

LINUX中如何查看某个端口是否被占用 之前查询端口是否被占用一直搞不明白,问了好多人,终于搞懂了,现在总结下: 1.netstat -anp |grep 端口号 如下,我以3306为例,netstat -anp |grep 33...

覃大光
29分钟前
0
0
JBolt 1.5.0新版发布,升级到支持最新版JFinal和Jetty,实现了在线更新插件功能

JBolt是一个JFinal极速开发框架 定制版IDE插件 目前仅有Eclipse插件版,Idea插件版正在开发中。 JBolt的详细使用教程请移步到这里 =====版本1.5.0 更新内容 2018年10月13日10:41:52===== 注意...

山东-小木
31分钟前
0
0
laravel 微信支付

1.composer加载laravel微信支付第三方文件 composer require "overtrue/laravel-wechat:~4.0" composer require simplesoftwareio/simple-qrcode 1.3.* //composer生成二维码文件 2.改confi......

vio小黑
44分钟前
1
0
学习设计模式——抽象工厂模式

1. 认识抽象工厂模式 1. 定义:提供一个创建一系列相关或互相依赖的对象的接口,而无需指定它们具体的类。 2. 组成结构: AbstractFactory:抽象工厂类,定义创建一系列对象的操作接口 Fact...

江左煤郎
44分钟前
2
0
ES6的let块级作用域和变量不可提升导致一个比较容易出现的错误

今天在写NodeJS代码的时候出现一个变量一直提示未定义,简化后的代码如下: let param = 1;{ console.log(param);} 就在想,不至于啊。不是继承上层的声明吗? 继续看下去,发现原来...

MKjy
51分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部