關於System.out.println的多線程併發問題

本文轉載自 IT江湖,原文鏈接:Click me

如果println函數的參數爲常量則不會出現線程併發問題,但是如果參數爲表達式形式,則JVM在執行println函數的時候會分爲幾步來執行,從而造成併發問題。

如下例子所示:

執行的結果爲:
張三執行了2000,當前餘額:12000
李四執行了3600,當前餘額:15600
王五執行了2700,當前餘額:18300

老牛執行了1300,當前餘額:20200
老朱執行了800,當前餘額:21000
老張執行了600,當前餘額:18900

通過反編譯,上面println函數的主要處理過程分爲下面三步:

所以可以看出上面程序的執行順序爲:、

張三執行完->李四執行完->王五執行完->老張只執行到加操作,被老牛打斷->老牛執行完->老朱執行完->老張執行剩下的輸出操作

要想有一個正常的輸出順序,應該修改代碼爲:

結果爲:
張三執行了2000,當前餘額:12000
王五執行了2700,當前餘額:14700
老張執行了600,當前餘額:15300
老牛執行了1300,當前餘額:16600
老朱執行了800,當前餘額:17400
李四執行了3600,當前餘額:21000

【注意】這裏使用了一個對象鎖,來控制對併發代碼的訪問。不管運行多少次,執行次序如何,最終餘額均爲21000,這個結果是正確的。有關原子量的用法很簡單,關鍵是對原子量的認識,原子僅僅是保證變量操作的原子性,但整個程序還需要考慮線程安全的。

發佈了10 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章