Java高并发程序设计笔记--Java的内存模型(JMM)原子性

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,线程,JMM(内存模型))