javax.crypto.Mac#doFinal 是非线程安全,他会改变内部的状态。多线程使用时有三种方式:
1、使用clone函数
官方文档的示例代码
private Mac getMac() { // Mac is not thread-safe. Requires a new clone for each signature. try { return (Mac) mac.clone(); } catch (CloneNotSupportedException e) { throw new IllegalStateException(e); } } }
2、使用synchronized
synchronized (mac) { //code }
3、每次使用重新new
key:密钥
algoType:算法类型
try { Mac mac = Mac.getInstance(algoType); mac.init(new SecretKeySpec(key, algoType)); } catch (Exception e) { }