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; } }
這裡沒有使用鎖,但保證了執行緒安全,使用的是棧封閉的思想,
把物件快取到區域性變數進行修改,就不會產生靜態條件,
修改完成後再以原子的方式放回快取。