關於synchronized無法鎖住Integer原因
阿新 • • 發佈:2020-11-05
原因
在多執行緒的時候,為了保證資料安全,必須在修改資料時使用執行緒同步,java中的synchronized
用來實現執行緒同步、執行緒列隊。
學完多執行緒基礎的我,寫一個多執行緒交替輸出1,2,3,4,5...
,一個執行緒負責輸出偶數,一個執行緒負責輸出奇數,由於這個數是整數,在java中int
又是基本資料型別,基本資料型別並不是共享的,也就是基礎資料型別是在棧中申明,java提供了一個Integer
包裝類,使用的時候發現根本鎖不住這個物件。
回憶之前對Integer
的知識:為了提高程式效率,Integer
在類載入時就已經建立了-128到127
的物件
嗯!!!!如果我對這個物件進行運算的話!記憶體地址是不是也不一樣?(細思極恐)
System.out.println(num++;)
粗暴解決方案
建一個加鎖類(人工造鎖),將需要用到的運算什麼的加進去,嗯簡單粗暴!!!!
class IntegerLock { private Integer num = 0; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public Integer remainder(Integer o) { return num % o; } public void plus(Integer o) { num = num + o; } @Override public String toString() { return num.toString(); } }