多線程阿里筆試題1

題目

下面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方法沒有加同步鎖,當兩個線程並行執行的時候,無法保證數據的原子性,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章