題目
下面addOne()函數是否線程安全,請回答原因
public class Test {
private volatile int value = 0;
void addOne(){
++value;
}
}
測試代碼
public static void main(String[] args) throws InterruptedException {
Test test = new Test();
for (int i = 0; i < 100; i++){
new Thread(()->{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
test.addOne();
}).start();
}
Thread.sleep(5000);
System.out.println(test.getValue());
}
測試結果
通過以上代碼進行測試,每次的結果都不同,如果線程是安全的,那麼最終的打印結果應該是100.
所以說addOne()函數線程不安全.
分析
volatile 關鍵字只能保證數據被一個線程修改之後,及時的對其它線程可見,addOne方法沒有加同步鎖,當兩個線程並行執行的時候,無法保證數據的原子性,