package com.itheima._4volatile;
public class Test2 {
public static void main(String[] args) throws InterruptedException {
MyThread2 my = new MyThread2();
my.start();
for (int i = 0; i < 100; i++) {
//Thread.sleep(10);//两个线程同时运行,总共 花费时间是1秒
Thread.sleep(50);//加入AtomicInteger,解决原子性,这时休眠不起作用
//MyThread2.money++;
MyThread2.money.getAndIncrement();
}
//等待(休眠)2秒 输出结果
Thread.sleep(5000);
//System.out.println("总额:"+MyThread2.money);//总额:146
System.out.println("总额:"+MyThread2.money);//总额:200
}
}
package com.itheima._4volatile;
import java.util.concurrent.atomic.AtomicInteger;
public class MyThread2 extends Thread{
//public static volatile int money = 0; //volatile,不能让 变量 是一个原子操作了
//加了static,在测试类能直接访问。如果私有化的话,要提供get set方法
//声明一个原子类 用于解决 非原子性问题
public static AtomicInteger money = new AtomicInteger();//必须通过构造方法。而包装类能 直接把 0 自动装箱。
@Override
public void run() {//在源码中,run方法不让抛异常throws //父类和子类异常最好保持一致
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(10);//休眠
} catch (InterruptedException e) {
e.printStackTrace();
}
//money++;
money.getAndIncrement();//先获取再++
}
}
}