1.i++ 线程非安全测试
package com.jdbc.test; import java.util.concurrent.CountDownLatch; public class Main { private int i; public int getI() { return i; } public void setI(int i) { this.i = i; } public void incr(){ i++; } public static void main(String[] args) throws InterruptedException { for(int j=0;j<10;j++){ final Main main=new Main(); final CountDownLatch count = new CountDownLatch(10000); for(int i=0;i<100;i++){ new Thread(new Runnable() { public void run() { // TODO Auto-generated method stub for(int j=0;j<100;j++){ try { Thread.sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } main.incr(); count.countDown(); } } }).start(); } //主线程等待子线程结束 count.await(); System.out.println(main.getI()); } } }
测试10次,几乎都不是10000
2.i++线程非安全原理
i++ 操作分为三步,第一步取i的值,第二步 让i加1 ,第三步更新i的值
如图主线程主有个i ,每个子线程中有一个i的拷备,当主线程i=0是,如果三个子线程同时读取到i的值为0,每个线程各自给i=i+1,然后分别写入主线程,这样三个线程执行后,虽然执行了3次i++ ,不过i的值为1.