1. 程式人生 > 實用技巧 >關於synchronized無法鎖住Integer原因

關於synchronized無法鎖住Integer原因

原因

在多執行緒的時候,為了保證資料安全,必須在修改資料時使用執行緒同步,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();
  }
}