您的位置:首页 > 编程语言 > Java开发

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进行写入的话,对线程之间的结果是干扰的。

例如一下代码

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 内存 线程 技术