Java高并发程序设计笔记--Java的内存模型(JMM)原子性
2017-10-29 12:38
477 查看
Java的内存模型JMM
JMM的关键技术都是围绕着多线程的原子性、可见性、有序性来建立的。
原子性:是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。
比如:对于一个静态全局变量int i,两个线程同时对他赋值,线程A给他赋值1,线程B给他赋值-1,那么不管这2个线程以何种方式、何种步调工作,i的值要么是1,要么是-1.
线程A和线程B之间互不干扰
但是如果我们不使用int型而使用long型,可能就没有那么幸运了,对于32位系统来说long型数据的读写不是原子性的。也就是说两个线程同时对long进行写入的话,对线程之间的结果是干扰的。
例如一下代码
上述代码有4个线程对long型数据进行赋值,然后一个读线程,读取这个t值,一般来说,t的值总是4个数值中的一个,但很不幸,在32位虚拟机中,未必总是这样的。
JMM的关键技术都是围绕着多线程的原子性、可见性、有序性来建立的。
原子性:是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。
比如:对于一个静态全局变量int i,两个线程同时对他赋值,线程A给他赋值1,线程B给他赋值-1,那么不管这2个线程以何种方式、何种步调工作,i的值要么是1,要么是-1.
线程A和线程B之间互不干扰
但是如果我们不使用int型而使用long型,可能就没有那么幸运了,对于32位系统来说long型数据的读写不是原子性的。也就是说两个线程同时对long进行写入的话,对线程之间的结果是干扰的。
例如一下代码
package line.caowen.jmm; public class MultiThreadLong { public static long t=0; public static class ChangeT implements Runnable{ private long to; public ChangeT(long to){ this.to=to; } public void run(){ while(true){ MultiThreadLong.t = to; Thread.yield(); } } } public static class ReadT implements Runnable{ public void run(){ while(true){ long tmp = MultiThreadLong.t; if(tmp!=111L&&tmp!=-999L && tmp != 333L && tmp != -444L){ System.out.println(tmp); } Thread.yield(); } } } public static void main(String args[]){ new Thread(new ChangeT(111L)).start(); new Thread(new ChangeT(-999L)).start(); new Thread(new ChangeT(333L)).start(); new Thread(new ChangeT(-444L)).start(); new Thread(new ReadT()).start(); } }
上述代码有4个线程对long型数据进行赋值,然后一个读线程,读取这个t值,一般来说,t的值总是4个数值中的一个,但很不幸,在32位虚拟机中,未必总是这样的。
相关文章推荐
- java高并发程序设计学习笔记三内存模型线程安全
- Java高并发程序设计笔记3之内存模型和线程安全
- 并发编程笔记(三):Java 内存模型(二)
- Java高并发程序-Chapter2 Java并行程序基础 (第六讲)volatile 与 Java 内存模型 JMM
- Java并发之内存模型-JMM
- Java并发——关于Java内存模型(JMM),你需要知道什么?
- Java高并发程序-Chapter1 并行世界 (第三讲)Java 内存模型 JMM
- 修复 Java 内存模型,第 2 部分(在 JSR 133 中 JMM 会有什么改变?)
- 【实战Java高并发程序设计 5】让普通变量也享受原子操作
- 【JAVA基础】关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
- 深入理解Java虚拟机笔记---内存模型
- Java 内存模型 JMM
- JVM-并发-Java 内存模型
- Java并发编程:volatile关键字解析(一.内存模型的相关概念)
- java学习笔记之内存模型
- Java基础复习一之多线程(并发,内存模型)
- java 内存模型(JMM)简介
- Java并发学习笔记(九)-原子类AtomicInteger
- java并发内存模型
- [学习笔记]Java面向对象思想和内存模型