原因:
當多個線程同時共享,同一個全局變量或靜態變量。做寫的操作時,可能發生數據衝突問題,也就是線程安全問題。但是做讀操作是不會發生數據衝突問題。
解決方案:
方式一:內置鎖Synchronized
Synchronized保證線程原子性,當線程進入方法的時候,自動獲取鎖,一旦鎖被其它線程獲取之後,其它的線程就會等待。
方式二:同步方式
1、同步代碼塊
Synchronized(任意全局對象){
需要同步的代碼
}
同步代碼塊需要注意的事項:
1.鎖對象可以是任意的一個對象;
2.一個線程在同步代碼塊中sleep了,並不會釋放鎖對象;
3.如果不存在線程安全問題,千萬不要使用同步代碼塊;
4.鎖對象必須是多線程共享的一個資源,否則鎖不住。
2、同步方法:非靜態同步方法與靜態同步方法
修飾在方法上,非靜態同步方法用的是this證明鎖。