我编写了自己的简化@IfProfileValue
包装器,现在我想知道它是否是线程安全的。
MessageDigest
答案 0 :(得分:2)
我怀疑,我的代码不是线程安全的。
例如,如果2个线程共享相同的SimpleIMD
对象,并且方法调用的顺序将是这样的:
T1 T2
| |
update() |
| |
| digest()
| |
| |
| |
然后无法保证update()
将在digest()
之前完成。
事实上,digest()
甚至可能会在MessageDigest
之前重置基础update()
实例,而T1
会有错误的哈希值。通过在新副本上执行digest()
可以解决此问题。
所以方法:
@Override
public byte[] digest() {
return this.md.digest();
}
必须更改为:
@Override
public byte[] digest() {
return this.cloneMessageDigest(this.md).digest();
}