String中hashCode方法的執行緒安全

胡海超發表於2018-08-12
class String{
  //預設值是0
  int hash;

  public int hashCode() {
       //將成員變數hash快取到區域性變數
        int h = hash;
    //這裡使用的是區域性變數,沒有多執行緒修改的風險
        if (h == 0 && value.length > 0) {
            char val[] = value;
            //求hashcode過程使用區域性h變數防止產生靜態條件
            for (int i = 0; i < value.length; i++) {
                h = 31 * h + val[i];
            }
            //把求出的hashcode快取到區域性變數,原子操作,這裡不需要考慮執行緒可見性的問題,如果其它執行緒未能及時看到最新修改,重新計算hash值代價也不大
            hash = h;
        }
return h; } }

這裡沒有使用鎖,但保證了執行緒安全,使用的是棧封閉的思想,

把物件快取到區域性變數進行修改,就不會產生靜態條件,

修改完成後再以原子的方式放回快取。

相關文章