String中hashCode方法的线程安全
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; } }
这里没有使用锁,但保证了线程安全,使用的是栈封闭的思想,
把对象缓存到局部变量进行修改,就不会产生静态条件,
修改完成后再以原子的方式放回缓存。