原子类解决i++问题

原子类解决i++问题

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 一个完整的i++,多线程并发安全问题演示。及使用java.util.concurrent.atomic.AtomicInteger解决方案。
 * @author jie
 *
 */
public class Counter {
	public static void main(String[] args) {
		//定义并发线程数量
		int threadCount = 10;
		Thread[] t = new Thread[threadCount];
		
		//开启多个线程进行计数
		for(int i = 0; i < t.length; i++) {
			t[i] = new Thread(new Runnable() {
				public void run() {
					for(int j = 0; j < 10000; j++) {
						AtomicCount.increment();//1
						//Count.increment();//2
					}
				}
			});
			t[i].start();
		}
		
		//等待所有线程结束,打印最终的结果
		for(int i = 0; i < t.length; i++) {
			try {
				t[i].join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println(AtomicCount.i);//1
		//System.out.println(Count.i);//2
	}
}

class AtomicCount{
	public static AtomicInteger i = new AtomicInteger(0);
	
	public static void increment() {
			i.addAndGet(1);
	}
}

//普通的类,无法保证线程安全。
class Count{
	public static int i = 0;
	
	public static void increment() {
			i++;
	}
}

原子类实现方式CAS

CAS
	什么是CAS?
	比较并交换。一种原子性操作。3个操作数,内存地址,期望值,新值。
	比较内存地址值和期望值是否一致,一致则表示期望值确实是最新的内存值,
	基于期望值得到的新值是有效的,将内存值改为新值,操作成功。否则失败。
	
	do{
		1.获取内存值,做为期望值
		2.基于内存值进行操作,得到新数据
	}while(CAS(内存地址,期望值,新数据)失败)
原文地址:https://www.cnblogs.com/mozq/p/12031631.html