这个MessageDigest包装器是否是线程安全的?

时间:2016-08-20 00:12:14

标签: java concurrency thread-safety immutability

我编写了自己的简化@IfProfileValue包装器,现在我想知道它是否是线程安全的。

MessageDigest

1 个答案:

答案 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();
}