这是来自Java的String hashCode函数的代码
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }
如您所见,它检查散列("private int hash")== 0并以其他方式设置它.构造函数并不总是设置此值(以及为什么还要检查当然).
因此,虽然在实际应用中很难再现,但看起来这个哈希上的竞争条件似乎正确吗?
我的意思是,一旦你把它放在一个hashmap中,它就会安全,除非你先把它发送到另一个线程.但是如果字符串在两个线程上并同时添加到散列映射中,则hashMap函数可以采用部分写入的"散列"值并返回它.
从理论上讲,可以生成一些代码,这些代码会导致多个同时线程读取0值哈希并进入计算部分.这将是"浪费",但是安全,因为函数对不可变字符进行操作,并且每个实例将计算完全相同的散列值.