Forum Stats

  • 3,838,498 Users
  • 2,262,376 Discussions
  • 7,900,672 Comments

Discussions

Cipher blocking issue

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:

  1. 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.

This discussion has been closed.