Java陷阱

問:下面程序的運行結果是什么?

int count =0;

for(int i=0; i<100; i++) {

? ? count = count++;

}

System.out.println("count=" + count);

答:運行結果是 count = 0。

首先 count++ 是一個有返回值的表達式,返回值是 count 自加前的值,Java 對自加處理的流程是先把 count 的值(不是引用)拷貝到一個臨時變量區,然后對 count 變量加1,接著返回臨時變量區的值。

所以上面代碼塊中第一次循環的執行步驟是 JVM 把 count 值(0)拷貝到臨時變量區,然后 count 值加 1,這時 count 的值是 1,接著返回臨時變量區的值(值是 0),最后返回值賦值給 count,此時 count 值被重置成 0;所以上面代碼語句 count = count++; 可以按照如下代碼來理解:

int autoAdd(int count) {?

? ? int temp = count;

? ? count = count + 1;?

? ? return temp;

}

所以第一次循環后 count 的值還是 0,其他 99 次的循環也是一樣的,最終導致 count 的值始終沒有改變,仍然保持著最初的狀態;如果想要打印結果為 100 則需要修改 count = count++; 語句為 count++; 即可。因此對于 ++/-- 運算在 java 中一定要警惕這個陷阱(-- 運算符也一樣存在這個問題),不過這個問題在不同的語言環境中的實現是不同的,在 C++ 中 count = count++; 與 count++ 是等效的,而在 java 等語言中 count = count++; 與 count++ 是不等效的,區別如這道題。

Java

問:Java 或者 Android 開發中可以通過哪些方式來保證并發安全的自增自減操作?

答:java 默認的自增自減運算符是非并發安全的,要想實現并發安全的自增自減操作可以通過如下幾種方式實現。

通過 synchronized 代碼塊或者方法來保證自增自減并發安全。

通過主動使用 Lock 鎖來保證自增自減并發安全。

通過 JDK 提供的 AtomicInteger 類來直接保證自增自減并發安全。

上面幾種做法中最推薦直接使用 AtomicInteger 的方式,因為其相對于其他幾種方式封裝性非常便捷,此外其實現基于 volatile 對象的 CAS 操作來保證并發安全,算是一種相對高效的方式

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,771評論 0 33
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,766評論 18 399
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,948評論 18 139
  • 文 / 平生心事 在《紅樓夢》里,男人們被曹公排著隊抖落,其中描寫賈璉好色的片段最多。 賈璉,一個比較典型的花花公...
    平生心事閱讀 1,474評論 0 4
  • 2月的最后一天 我一直都在。 今日推薦: 林俊杰,從一開始的《江南》,到后來的《編號89757》,他的聲音就很有辨...
    小鹿愛生活筆記閱讀 351評論 1 1