多線程容易“非線程安全”的情況,是由於用了全局變量,而又沒有很好的控制起情況。所以無論做什么程序,謹慎使用全局變量
"非線程安全"其實會在多個線程對同一個對象中的實例變量進行並發訪問時發生,產生的后果就是“臟”讀。
如以下代碼就會出現“臟”讀的情況:
package com.ming.thread.t1; public class Count { int count=0; public void add(String str){ if("a".equals(str)){ count=100; try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(count); }else{ count=200; System.out.println(count); } } }
建立兩個線程:
package com.ming.thread.t1; public class ThreadA extends Thread{ private Count count; public ThreadA(Count count){ this.count=count; } public void run(){ count.add("a"); } }
package com.ming.thread.t1; public class ThreadB extends Thread{ private Count count; public ThreadB(Count count){ this.count=count; } public void run(){ count.add("b"); } }
在建立一個測試類:
package com.ming.thread.t1; public class Test { public static void main(String[] args) { Count count=new Count(); ThreadA a=new ThreadA(count); a.start(); ThreadB b=new ThreadB(count); b.start(); } }
最后輸出:200 200,顯然出現了臟讀數據了。
最后將變量保存在方法中,這個問題解決。
所以寫代碼要注意這個問題了..