public class HelloWorld { //
public static volatile int account=0;
public static void main(String[] args) {
Thread thread1=new Thread(){
@Override
public void run() {
for (int i = 0; i <100000 ; i++) {
account = account + 1;// 这段代码提醒的错误
}
System.out.println("线程1计算的存入的结果"+account);
}
};
Thread thread2=new Thread(){
@Override
public void run() {
for (int i = 0; i <100000 ; i++) {
account = account + 1;
}
System.out.println("线程2计算的存入的结果"+account);
}
};
System.out.println(account);
thread1.start();
thread2.start();
}
}
打印结果:
线程2计算的存入的结果109589
线程1计算的存入的结果145396
预期结果: 200000
在读取变量修改变量保存变量 同时完成的情况下,使用原子变量实现线程同步最快捷,上边的问题是因为volatile 不具有原子性,所以方法失效,原子性用AtomicInteger类实现,修改上边代码如下
package a;
import java.util.concurrent.atomic.AtomicInteger;
public class HelloWorld { //
public static AtomicInteger account=new AtomicInteger(0);
public static void main(String[] args) {
Thread thread1=new Thread(){
@Override
public void run() {
for (int i = 0; i <10000000 ; i++) {
account.addAndGet(1);// 这段代码提醒的错误
}
System.out.println("线程1计算的存入的结果"+account.get());
}
};
Thread thread2=new Thread(){
@Override
public void run() {
for (int i = 0; i <10000000 ; i++) {
account.addAndGet(1);// 这段代码提醒的错误
}
System.out.println("线程2计算的存入的结果"+account.get());
}
};
System.out.println(account);
thread1.start();
thread2.start();
}
}
打印结果:
线程1计算的存入的结果19132037
线程2计算的存入的结果20000000