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位虚拟机中,未必总是这样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值