java - 标准PBEByteEncryptor 锁
问题描述
为什么 StandardPBEByteEncryptor 会锁定一个对象?
"pool-2-thread-115" - Thread t@169
java.lang.Thread.State: BLOCKED
at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.decrypt(StandardPBEByteEncryptor.java:1035)
- waiting to lock <55a2b29b> (a javax.crypto.Cipher) owned by "pool-2-thread-114" t@168
at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.decrypt(StandardPBEStringEncryptor.java:725)
at org.jasypt.util.text.BasicTextEncryptor.decrypt(BasicTextEncryptor.java:112)
at com.ahmetk.tims.statcalculator.kafka.consumer.XMPPTxnLogKafkaClient.process(XMPPTxnLogKafkaClient.java:129)
at com.ahmetk.tims.statcalculator.kafka.consumer.XMPPTxnLogKafkaClient.lambda$processMessage$0(XMPPTxnLogKafkaClient.java:107)
at com.ahmetk.tims.statcalculator.kafka.consumer.XMPPTxnLogKafkaClient$$Lambda$227/859670158.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Locked ownable synchronizers:
- locked <21b2529d> (a java.util.concurrent.ThreadPoolExecutor$Worker)
"pool-2-thread-114" - Thread t@168
java.lang.Thread.State: RUNNABLE
at sun.security.provider.DigestBase.engineDigest(DigestBase.java:158)
at java.security.MessageDigest$Delegate.engineDigest(MessageDigest.java:592)
at java.security.MessageDigest.digest(MessageDigest.java:365)
at com.sun.crypto.provider.PBES1Core.deriveCipherKey(PBES1Core.java:272)
at com.sun.crypto.provider.PBES1Core.init(PBES1Core.java:244)
at com.sun.crypto.provider.PBEWithMD5AndDESCipher.engineInit(PBEWithMD5AndDESCipher.java:221)
at javax.crypto.Cipher.init(Cipher.java:1394)
at javax.crypto.Cipher.init(Cipher.java:1327)
at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.decrypt(StandardPBEByteEncryptor.java:1036)
- locked <55a2b29b> (a javax.crypto.Cipher)
at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.decrypt(StandardPBEStringEncryptor.java:725)
at org.jasypt.util.text.BasicTextEncryptor.decrypt(BasicTextEncryptor.java:112)
at com.ahmetk.tims.statcalculator.kafka.consumer.XMPPTxnLogKafkaClient.process(XMPPTxnLogKafkaClient.java:129)
at com.ahmetk.tims.statcalculator.kafka.consumer.XMPPTxnLogKafkaClient.lambda$processMessage$0(XMPPTxnLogKafkaClient.java:107)
at com.ahmetk.tims.statcalculator.kafka.consumer.XMPPTxnLogKafkaClient$$Lambda$227/859670158.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
解决方案
使用多线程解密 当我们在多核机器上运行时,我们希望并行处理解密。为了获得良好的性能,我们可以使用 PooledPBEStringEncryptor 和 setPoolSize() API 创建一个消化池。它们中的每一个都可以由不同的线程并行使用:
PooledPBEStringEncryptor 加密器 = new PooledPBEStringEncryptor(); 加密器.setPoolSize(4); encryptor.setPassword("一些随机数据"); encryptor.setAlgorithm("PBEWithMD5AndTripleDES"); 将池大小设置为等于机器的核心数是一种很好的做法。加解密的代码和前面的一样。
推荐阅读
- global-variables - 一个变量可以继承其他变量的元素吗?
- tensorflow - TensorFlow 不生成 GPU 跟踪信息
- c++ - C++ 根库 - TF1.GetRandom() 函数无法正常工作
- ios - 处理整个应用程序的 Internet 连接
- javascript - 具有父节点和公共节点的 d3 和 Highcharts 图
- python - Django 模板没有获取上下文变量
- python - 如何在满足特定条件的字符串列表中添加子字符串?
- ios - iOS:在 UITableView 中使用安全文本字段时 UIKeyboard 闪烁
- angular - 为什么我的 TestBed 提供者不覆盖真实的服务?
- javascript - 在对象数组中,如何更新(而不仅仅是查找)属性 X 等于 Y 的对象?