java i++ 并非原子操作的解决方法——用AtomicInteger

以下代码只在运行结束后打印结果


[java]  view plain  copy
  1. public class Test1 {  
  2.     private static  int a = 0;  
  3.     public static void main(String[] args) throws InterruptedException{  
  4.         System.err.println("LOL");  
  5.         int n=500000;  
  6.         while(n-->0){  
  7.             startAdd();  
  8.         }  
  9.         Thread.sleep(2000);  
  10.         System.err.println(a);  
  11.     }  
  12.     public static void startAdd(){  
  13.         new Thread(new Runnable() {  
  14.             @Override  
  15.             public void run() {  
  16.                 a++;  
  17.             }  
  18.         }).start();  
  19.     }  
  20. }  


运行了5次结果

499980

499984

499982

499973

499989


而如果用AtomicInteger

[java]  view plain  copy
  1. public class Test2 {  
  2.     private static  AtomicInteger a = new AtomicInteger(0);  
  3.     public static void main(String[] args) throws InterruptedException{  
  4.         System.err.println("LOL");  
  5.         int n=500000;  
  6.         while(n-->0){  
  7.             startAdd();  
  8.         }  
  9.         Thread.sleep(2000);  
  10.         System.err.println(a);  
  11.     }  
  12.     public static void startAdd(){  
  13.         new Thread(new Runnable() {  
  14.             @Override  
  15.             public void run() {  
  16.                 a.getAndIncrement();  
  17.             }  
  18.         }).start();  
  19.     }  
  20. }  
运行5次结果

500000

500000

500000

500000

还是500000

懂了吧


猜你喜欢

转载自blog.csdn.net/xiaoyangsavvy/article/details/78468833