1. 程式人生 > >String中hashCode方法的線程安全

String中hashCode方法的線程安全

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方法的線程安全