String中hashCode方法的線程安全
阿新 • • 發佈:2018-08-12
str hash 變量 style 重新 turn ++ 如果 成員
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; } }
這裏沒有使用鎖,但保證了線程安全,使用的是棧封閉的思想,
把對象緩存到局部變量進行修改,就不會產生靜態條件,
修改完成後再以原子的方式放回緩存。
String中hashCode方法的線程安全