一、自增會帶來線程安全問題嗎?爲什麼?
會!
1.i++在字節碼層面分爲三步:保存當前值,執行添加操作,更新新值
2.多線程操作時,可能會同時獲取到舊值(假設爲1),添加操作後爲2,第一個線程刷新新值爲3,第二個刷新還是3。
二、volatile可以保證線程安全嗎?
不可以!
volatile只能保證可見性,以及順序性
但是不能保證多個線程同時操作
三、如何保證線程安全?
synchronized,將方法原子化
automicInteger.getAndSwap
會!
1.i++在字節碼層面分爲三步:保存當前值,執行添加操作,更新新值
2.多線程操作時,可能會同時獲取到舊值(假設爲1),添加操作後爲2,第一個線程刷新新值爲3,第二個刷新還是3。
不可以!
volatile只能保證可見性,以及順序性
但是不能保證多個線程同時操作
synchronized,將方法原子化
automicInteger.getAndSwap