参考链接:http://www.cnblogs.com/paddix/p/5374810.html
代码:
public class Count { public int num; public void add(){ for(int i =0;i < 10;i++){ num++; } System.out.println(Thread.currentThread().getName()+"-" +num); } }
public class MyThreadTest { public static void main(String[] args){ Count count = new Count(); for(int i =0;i<10;i++){ new Thread(new Runnable() { @Override public void run() { try {
/增加线程的并发性 Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } count.add(); } }).start(); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(count.num); } }
结果展示:
Thread-9-80 Thread-7-90 Thread-4-70 Thread-5-70 Thread-2-70 Thread-0-80 Thread-1-70 Thread-6-80 Thread-3-70 Thread-8-70 90
以上的代码原本应该等于100,但由于存在线程的问题,10个线程同时共享同一个变量,这样就容易产生线程安全问题。
原因:线程直接不能直接传递数据,他们之间的交互是通过共享数据来实现。如上述的代码中,10个线程共用一个count对象,这个count对象是在主内存中,每个线程都有自己的线程栈,都是从主存中读取count对象的值并复制过来,然后执行完add()方法后,再刷新到主存中,这样就很容易造成线程安全。