package com.chot; /** * @program: rtm * * @description: 原子操作demo * * @author: ninesun * * @create: 2019-11-18 09:28 **/ import java.util.concurrent.atomic.AtomicInteger; /* * 下边两个操作多试几次总会出现不一样的值 * 这是因为第一个操作是非线程安全的,会出现多个线程同时操作一个值的情况 * 后边那个则是原子操作有不可分割性质,所以不会出现那种情况 * */ public class TestMyAtomic { static int index = 0; static int num = 10000; static AtomicInteger atomicIndex = new AtomicInteger(0);//设置初始值为0 public static void main(String[] args) { //情况一 //正常的index++操作属于非原子性操作 //创建一万个线程进行index++操作 Thread[] threads = new Thread[num]; for (int i = 0; i < num; i++) { Thread t = new Thread() { @Override public void run() { index++; } }; t.start(); threads[i] = t; } for (Thread t : threads) { try { //确保当前t线程加入主线程,运行完毕再继续后边操作 t.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(index); //情况二 //以下是原子操作 Thread[] threadsAtomic = new Thread[num]; for (int i = 0; i < num; i++) { Thread t = new Thread() { @Override public void run() { atomicIndex.incrementAndGet(); } }; t.start(); threadsAtomic[i] = t; } for (Thread t : threadsAtomic) { try { //确保当前t线程加入主线程,运行完毕再继续后边操作 t.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(atomicIndex.intValue()); } }