java原子性操作理解
java原子性操作理解
yiqifendou 发表于1年前
java原子性操作理解
  • 发表于 1年前
  • 阅读 12
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

/**
 * Created by wangzhongbao on 2016/9/28.
 */
public class TestAtomicOperate {
	private static int increCount = 1000000;
	//private static int num = 0;
	public static void main(String[] args) {
		TestAtomicOperate t = new TestAtomicOperate ();
		t.testDirectOperate(1000);
		t.testNotAtomicOperate(1000);
		t.testAtomicOperate(1000);

	}

	class NumRef{
		long num;
		public NumRef(long num){
			this.num = num;
		}
	}
	private int a = 0;
	private void testNotAtomicOperate(int threadCount){

		NumRef resultNr = new NumRef(0);
		AtomicInteger cai = new AtomicInteger(0);
		for(int i=0;i<threadCount;i++){
			new Thread(){
				@Override
				public void run() {
					for(int i=0;i<increCount;i++){
						resultNr.num++;
					}
					cai.incrementAndGet();
					if(cai.get()==threadCount){
						System.out.println("非原子性操作执行完毕,结果为: " + resultNr.num);
					}
				}
			}.start();
		}
	}

	private void testAtomicOperate(int threadCount){
		AtomicLong resultAi = new AtomicLong(0);
		AtomicInteger cai = new AtomicInteger(0);
		for(int i=0;i<threadCount;i++){
			new Thread(){
				@Override
				public void run() {
					for(int i=0;i<increCount;i++){
						resultAi.incrementAndGet();
					}
					cai.incrementAndGet();
					if(cai.get()==threadCount){
						System.out.println("原子性操作执行完毕,结果为:" + resultAi.get());
					}
				}
			}.start();
		}
	}
	private void testDirectOperate(int threadCount){
		long result = 0;
		for(int i=0;i<threadCount;i++){
			for(int j=0;j<increCount;j++){
				result++;
			}
		}
		System.out.println("单线程直接计算:"+result);
	}


}

执行结果如下:

单线程直接计算:1000000000

非原子性操作执行完毕,结果为: 984932415

原子性操作执行完毕,结果为:1000000000

由此可见:java里面 ++ 操作是非原子性的,线程不安全,所以java提供了AtomicInteger等类

标签: java 原子性操作
共有 人打赏支持
粉丝 5
博文 49
码字总数 8974
×
yiqifendou
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: