在java并发编程中,我们一般会说需要满足以下三个基本条件才能构成java并发的基础,这三个特性分别是:有序性、可见性、原子性。那么这三个特性到底是一个怎么样的概念呢,下面我们将通过一些例子来详细说明一下这几个概念。

有序性:有序性是指在java并发中,如果执行编码的两条指令按照代码的先后顺序执行。设想一下,如果代码的执行顺序和我们看到的代码顺序不一样,那很可能会导致结果错乱。可为什么会导致代码执行和我们编写看到的不一样呢?这是因为编译器,处理器为了提升执行效率会对代码编译过后的执行指令进行重新排序(指令重排序)。在as-if-serial中规定了执行重排序一定要满足执行的结果不受指令排序的影响,编译器和处理器都会遵守这个规则,但是as-if-serial是针对单线程的,它只定义了单线程下指令重排序不能影响执行结果,对于多线程的情况下,有可能会导致执行结果不可预料。看下下面的demo,一个比较经典的双重检查单例:

 public class Singleton {  private static Singleton singleton;  private Singleton() {  }  public static Singleton newInstance() {  if (singleton == null) {  synchronized (Singleton.class) {  if (singleton == null) {  singleton = new Singleton();  }  }  }  return singleton;  }  }  

上面这个单例写法在极端情况下可能会导致问题,singleton不可用。原因在于:假设一个线程A执行第10行的时候,初始化一个singleton对象,如果了解java对象创建的同学应该知道,一个对象的创建有几个关键的步骤:1.申请内存空间,2.初始化对象 3.将栈中singleton指向对象的地址;在这里编译器为了优化性能,可能会将2和3进行交换一下执行,这个在单线程的情况下不会有任何问题,但是在多线程的条件下,假设在线程A执行第三步的时候,线程B执行到第7行,发现这个对象不是null,就直接返回了,这个时候,该对象还没有初始化,那么久会导致线程B获取到的对象不可用。

上面是一个比较经典的指令重排序导致多线程问题,所以在多线程的情况下,有序的按照我们写的代码的执行是一个基本的前提条件。

可见性:在java语言中,每个线程都保留了一份用到的变量在本地缓存,而在主存中也有一份,其示意图如下:

如何保证线程A修改了变量值,线程B也能立马感应到,这就是可见性要描述的问题,在多线程的环境下,如果一个线程的本地副本值修改了,另一个线程能立马感知到这个变化,并且使用的是变化后的值,那么这样就构成了多线程的第二个基本概念:可见性。

原子性:第三个特性是指在执行一条指令的时候,对其他线程而言,要么执行成功,要么执行失败,没有中间状态,并且在执行的时候,其他线程是不能打断其执行的。这也有一个比较经典的例子:

int i=0;//只有这个是原子操作 1) int b=i;  // 2)i++;  // 3)i=i+1; // 4) 

上面有四行代码,只有第一行是原子性操作,在处理器中,它们能够保证从内存中读写单个字节是原子的,换句话说当一个核cpu在处理这块内存地址的时候,其他cpu是不能访问这个地址的,对于更复杂的操作,处理器能够提供总线锁定和缓存锁定来保证原子性,像第一行的代码,i =0;处理器提供一些相关的指令来保证原子性操作,XADD,BTS,CMPXCHG等,我们只需要调用这些指令就能保证这些操作一定是原子性操作,对于java程序员而言,我们需要了解的是CAS操作就是通过CMPXCHG指令实现原子性的。从这里可以看到,如果一个线程在执行的过程中,被另一个线程打断或者修改内存中的值,那就可能导致结果不正确。这就是构成java多线程并发的第三个基础:原子性。

当我们了解了java多线程是怎么一回事,了解了底层是怎么保证线程并发的可靠时,我们在看下这三个基本特性,就能明白理解这三个基本特性对理解java并发有多大的意义。

想要了解更多java内容(包含大厂面试题和题解)可以关注公众号,也可以在公众号留言,帮忙内推阿里、腾讯等互联网大厂哈。

java并发三大特性--有序性、可见性、原子性相关推荐

  1. 巩固剖析并发基础:并发三大特性详解 代码实例分析可见性问题 深入了解JMM模型

    文章目录 一.并发和并行 二.并发三大特性 2.1 可见性 2.2 有序性 2.3 原子性 三.Java内存模型(JMM) 3.1 JMM定义 3.2 JMM与硬件内存架构的关系 3.3 内存交互操作 ...

  2. 并发编程之深入理解JMM并发三大特性volatile

    并发编程之深入理解JMM&并发三大特性&volatile 并发和并行 并发三大特性 可见性 有序性 原子性 Java内存模型(JMM) JMM定义 JMM与硬件内存架构的关系 内存交互 ...

  3. 【Java 并发编程】线程简介 ( 进程与线程 | 并发概念 | 线程间通信 | Java 并发 3 特性 )

    文章目录 一.进程与线程 二.并发 三.线程间通信 四.Java 并发 3 特性 一.进程与线程 最开始是没有线程这个概念的 , 一个应用程序就是一个进程 , 应用程序运行时 , 如果还要处理与用户交 ...

  4. Java的三大特性之继承

    此处我会分为这几个部分来理解继承是怎么样的: 1.区分封装.继承和多态 2.区分限定词的范围 3.区分隐藏.覆盖.重载 4.继承的理解 5.一道面试题的原型 --------------------- ...

  5. java的封装性的优点_18、Java的三大特性之封装

    Java的三大特性 java是一个面向对象的语言,所以java也有面向对象语言的三大特性:继承,封装,多态,任何一个java项目,都会用到这三种特性,所以掌握好这三大特性非常的重要. 封装 我们为什么 ...

  6. java三大特性 继承_java基础(二)-----java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

  7. 【转】java提高篇(二)-----理解java的三大特性之继承

    [转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...

  8. JAVA的三大特性(举例说明)

    众所周知,Java属于面向对象编程的一种语言,基于面向对象编程则更加符合人的思维模式,编写的程序亦能够更加健壮和强大.而Java的三大特性则是指:封装性.继承性.多态性!下面我通过具体的实例谈一下自己 ...

  9. java提高篇(三)-----理解java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  10. java 集成_java提高篇(二)-----理解java的三大特性之继承

    在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...

最新文章

  1. Win7如何改变用户文件夹位置
  2. 腹式肠道操 缩胃瘦身有奇效 - 健康程序员,至尚生活!
  3. c语言主范式与编码,超详细!终于搞明白KMP算法
  4. MySQL高级 - 锁 - InnoDB行锁 - 介绍及背景知识
  5. 用计算机画有常数的函数图像,信息技术应用 用计算机画函数图象教学设计及教案分析...
  6. AITO问界 M5正式交付:搭载华为鸿蒙系统 24.98万元起
  7. 全面解析Java的垃圾回收机制(转)
  8. 应用算法的实际情况——简单就是美
  9. 11 个创新的网站滑动效果设计案例展示
  10. 分享从零开始学习网络设备配置--2.1 交换机基本配置
  11. 一文告诉您游戏开发需要学什么
  12. 微信扫码支付 支付模式二
  13. 高德地图看各省分界线_高德地图API生成地图(含有各个省份边界线)
  14. 别 了,余 额 宝!
  15. 指数函数误差平方和matlab,数值分析与实验数学081 张燃 3080801119).doc
  16. 警惕男人出轨的六个高发期
  17. 如何改善客户体验和用户体验
  18. Linux时间与系统时间相差8小时的解决办法
  19. SOC低功耗电路设计方法
  20. 详细解读《个人所得税专项附加扣除暂行办法》

热门文章

  1. python表单验证wtf_正在验证wtfforms中的美国电话号码
  2. 华为云用docker部署halo
  3. Android自定义组件之日历控件-精美日历实现(内容、样式可扩展)
  4. 国外问卷调查回答问题有什么技巧?
  5. 使用nslookup查询域名的MX记录
  6. 高维空间向量搜索---腾讯词向量相似检索实践
  7. 深度剖析U8系统前后台数据关系-王成军-专题视频课程
  8. AJAX初窥门径教程
  9. 哔哩哔哩下载视频,教程,下载b站视频来就对了,下载b站 视频电脑 pc端
  10. eggs和egg是什么意思_eggs是什么意思_eggs的翻译_音标_读音_用法_例句_爱词霸在线词典...