在并发编程中,需要处理两个关键问题:线程之间如何通信,以及线程之间如何同步。通信是指线程之间如何交换信息,在命令式编程中,线程之间的通信机制有两种:内存共享和消息传递。
     同步是指程序中用于控制不同线程间的操作发生相对顺序的机制。在共享内存并发模型中,同步是显性进行的。程序员需要显性设置某段代码在线程之间的互斥执行。在消息传递的并发模型中,由于消息的发送必须在消息的接受之前,因此同步是隐性进行的。
     Java并发采用的是共享内存模型。
 
     Java内存模型(JMM)的关键技术点都是围绕着多线程的原子性、有序性、可见性来建立的。
 
     1. 原子性-Atomicity
     原子性是指一个操作是不可中断的。即使在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。
     例如,对于一个静态变量i,有两个线程对其赋值,线程A给它赋值1,线程B给它赋值2,那么不管这两个线程如何工作,i要么是1,要么是2。线程A和B之间是没有干扰的,这就是原子性的一个特点,不可被中断。
     但是如果使用long类型(long类型是64位)的话,对于32位操作系统而言,long型数据的读写不是原子操作,也就是说,多个线程同时对一个long进行操作的话,线程之间的结果是有干扰的。
 
     2. 可见性-Visibility
     可见性是指当一个线程修改了一个共享变量的值,其他线程是否能够立即知道这个修改。对于串行程序来说,这个问题是不存在的,因为在任何一个步骤中修改了变量值,在后续的步骤中读取这个值,一定是修改后的。
     但是在并行程序中就不见得了。如果一个线程修改了变量值,其他线程未必能马上知道这个改动。A线程和线程B分别读取了变量i,A再对变量i操作,这时候B是不一定能马上知道的。
 
     3.  有序性-Ordering
     对于一个线程的执行代码而言,我们总是习惯性的认为代码的执行是从前往后依次执行的。但是在并发时,程序的执行就可能出现乱序。给人的直观感受就是:后面的代码先执行,前面的代码后执行。听起来很不可思议,这是由于程序在执行时,可能会进行指令重排,即在不影响串行语义的情况下对指令的顺序进行调整,以优化CPU的执行效率(指令重排可以保证串行语义一致,但没有办法保证多线程间的语义也一致)。关于指令重排,后面抽空再写专门的文章来说明。
     虽然java虚拟机和执行系统会对指令进行重排,但是还是有一些原则是指令重排不能违背的,即Happen-Before规则:
          A 程序顺序原则:一个线程内保证语义的串行性
          B volatile规则:volatile变量的写,先发生于读,这保证了volatile变量的可见性(抽空写一篇关于volatile的介绍)
          C 锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
          D 传递性:A先于B,B先于C,则A必然先于C
          E 线程的start()方法先于它的每一个动作
          F 线程的所有操作先于线程的终结(Thread.join())
          G 线程的中断(interrupt())先于被中断线程的代码
          H 对象的构造函数执行、结束先于finalize()方法

java多线程的基础-java内存模型(JMM)的更多相关文章

  1. 多线程并发之java内存模型JMM

    多线程概念的引入是人类又一次有效压寨计算机的体现,而且这也是非常有必要的,因为一般运算过程中涉及到数据的读取,例如从磁盘.其他系统.数据库等,CPU的运算速度与数据读取速度有一个严重的不平衡,期间如果 ...

  2. Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)

    JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...

  3. 对多线程java内存模型JMM

    多线程概念的引入体现了人类重新有效压力寨计算机.这是非常有必要的,由于所涉及的读数据的过程中的一般操作,如从磁盘.其他系统.数据库等,CPU计算速度和数据读取速度已经严重失衡.假设印刷过程中一个线程将 ...

  4. Java内存模型JMM与可见性

    Java内存模型JMM与可见性 标签(空格分隔): java 1 何为JMM JMM:通俗地讲,就是描述Java中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这 ...

  5. 全面理解Java内存模型(JMM)及volatile关键字(转载)

    关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoad ...

  6. 全面理解Java内存模型(JMM)及volatile关键字(转)

    原文地址:全面理解Java内存模型(JMM)及volatile关键字 关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型( ...

  7. Java并发编程:Java内存模型JMM

    简介 Java内存模型英文叫做(Java Memory Model),简称为JMM.Java虚拟机规范试图定义一种Java内存模型来屏蔽掉各种硬件和系统的内存访问差异,实现平台无关性. CPU和缓存一 ...

  8. 深入理解Java内存模型JMM

    本文转载自深入理解Java内存模型JMM JMM基础与happens-before 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执 ...

  9. 什么是Java内存模型(JMM)

    什么是java内存模型 缓存一致性问题 在现代计算机中,因为CPU的运算速度远大于内存的读写速度,因此为了不让CPU在计算的时候因为实时读取内存数据而影响运算速度,CPU会加入一层缓存,在运算之前缓存 ...

随机推荐

  1. 密码学Hash函数

    定义: Hash函数H将可变长度的数据块M作为输入,产生固定长度的Hash值h = H(M). 称M是h的原像.因为H是多对一的映射,所以对于任意给定的Hash值h,对应有多个原像.如果满足x≠y且H ...

  2. Android动态加载入坑指南

    曾几何时,国内各大公司掀起了一股研究Android动态加载的技术,两年多过去了,动态加载技术俨然成了Android开发中必须掌握的技术.那么动态加载技术是什么呢,这里谈谈我的个人看法,如有雷同,纯属偶 ...

  3. (Android自定义View)来来来,一起再撸一个Material风格loadingView。

    本文同步自博主的个人博客wing的地方酒馆 很久很久以前,撸了一款loadingview(点击这里回顾),当时觉得还不错,现在看看觉得好丑啊!!! 于是想再撸一个,无意间在这里看到一个很不错的效果,于 ...

  4. 发现----Android Demo

    时间悄悄的走,转眼来实习已经三个月了,三个月的时间,小编慢慢的成长着,从刚开始的电商项目到现在的车段子项目,小编在走过一个又一个项目的同时,走过了一个又一个战胜自己的奇迹,每次遇到一个新的技术点,小编 ...

  5. android 关机充电流程

    点击打开链接 0.主要流程 usb插入通过传递cmdline给init解析从而启动充电进程 1. LK lk\app\aboot\aboot.c update_cmdline ---------- i ...

  6. myeclipse一直停留在Loading workbench界面上的处理办法

    找到工作目录比如我的叫work,在.metadata中删掉以下两个文 件,再次重启myeclipse走一个! org.eclipse.ui.workbench org.eclipse.ui.workb ...

  7. JSP自定义简单标签入门之带有属性

    上面写的那个简单标签来控制页面中标签内容的重复次数是固定的,这就是权限"写死了",这是非常不好的行为,因为其灵活性太差.所以下面就介绍一种使用属性来控制标签内容输出次数的方法. 准 ...

  8. 3、使用Gradle创建Libgdx项目

    (原文链接:http://www.libgdx.cn/topic/20/3-%E4%BD%BF%E7%94%A8gradle%E5%88%9B%E5%BB%BAlibgdx%E9%A1%B9%E7%9 ...

  9. 《java入门第一季》之类小案例(模拟用户登录)

    首先是做一个用户登录的小案例.在此基础上加入其它逻辑. import java.util.Scanner; /* * 模拟登录,给三次机会,并提示还有几次.如果登录成功,就可以玩猜数字小游戏了. * ...

  10. How To Transact Move Order Using INV_PICK_WAVE_PICK_CONFIRM_PUB.Pick_Confirm API

    In this Document Goal   Solution   Sample Code:   Steps:   FAQ   References APPLIES TO: Oracle Inven ...