We have a multi-threaded environment wherein we perform encryption and decryption using javax.crypto.Cipher class.
However, we are facing a Cipher blocking issue.
The thread dumps indicate the following state:
- java.lang.Thread.State: BLOCKED (on object monitor)
at java.security.Provider.getService(Provider.java:680)
- locked <0x0000000481680800> (a org.bouncycastle.jce.provider.BouncyCastleProvider)
at javax.crypto.Cipher.getInstance(Cipher.java:629)
at javax.crypto.Cipher.getInstance(Cipher.java:580)
.............................................
java.lang.Thread.State: BLOCKED (on object monitor)
at javax.crypto.JceSecurityManager.getCryptoPermission(JceSecurityManager.java:120)
- waiting to lock <0x00000004802e0c10> (a java.lang.Class for javax.crypto.JceSecurityManager)
at javax.crypto.Cipher.getConfiguredPermission(Cipher.java:2503)
at javax.crypto.Cipher.initCryptoPermission(Cipher.java:685)
at javax.crypto.Cipher.getInstance(Cipher.java:658)
at javax.crypto.Cipher.getInstance(Cipher.java:580)
java.lang.Thread.State: RUNNABLE
at java.lang.System.identityHashCode(Native Method)
at java.util.IdentityHashMap.hash(IdentityHashMap.java:301)
at java.util.IdentityHashMap.get(IdentityHashMap.java:334)
at javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:173)
- locked <0x00000004802e08b8> (a java.lang.Class for javax.crypto.JceSecurity)
at javax.crypto.Cipher.getInstance(Cipher.java:638)
There are many threads that are blocked at different stages of Cipher.getInstance() method waiting for other threads to perform operations so that they can release the synchronized methods/blocks. We did see that the Cipher.getInstance() method makes use of internal synchronization.
In our code, every thread makes a call to Cipher.getInstance(.....) method with a specified algorithm and provider to get the cipher object and then use it to encrypt/decrypt the data.
How can we resolve the blocking problem.
Would caching of Cipher instance be a solution to the problem. Any suggestions would be really appreciated.