java - 为什么要同步Java方法Provider.getService(String type,String algorithm)?

标签 java multithreading encryption synchronized jce

许多Java库都依赖Provider.getService方法,例如MessageDigest,Cipher等。当Web服务器需要哈希或加密作为其业务流程的一部分时,它将使用Java Security库,该库最终会调用该方法:

 public synchronized Service getService(String type, String algorithm)

在多线程服务器中,经过一定的负载后,许多线程开始争夺上述方法的锁定,这会导致非常严重的瓶颈,影响服务器的吞吐量。

我们通过添加Aspect来解决此问题,该Aspect拦截最终调用Provider.getService的方法并将这些对象的实例缓存在ThreadLocal中。

有人可以解释一下,为什么Provider.getService的开发人员首先决定将“同步”放在该方法上?为什么他们不能使用ConcurrentMap解决竞争条件?

最佳答案

Could someone explain please, why in first place the developers of the Provider.getService decided to put 'synchronized' on that method?? Why they could not solve the race condition by using ConcurrentMap?


Provider.getService(...)方法自1.5开始就可用,因此ConcurrentHashMap是在编写getService(...)时编写的。如果您看一下代码,则该调用所要做的不仅仅是执行映射操作。例如:
    // avoid allocating a new key object if possible
    ServiceKey key = previousKey;
    if (key.matches(type, algorithm) == false) {
        key = new ServiceKey(type, algorithm, false);
        previousKey = key;
    }

除非您提前创建程序员可能认为计算量过大的 key ,否则ConcurrentHashMap不会处理这种get/test/set操作。

也可能是他们希望人们完全按照您正在做的事来创建和缓存服务实例。当然,我一直在将这些放在ThreadLocal中。

希望这可以帮助。

关于java - 为什么要同步Java方法Provider.getService(String type,String algorithm)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27944331/

相关文章:

javascript - 在 Javascript 中简单地异或加密并在 Java 中解密

java - 从shell脚本获取值到java

iphone - 如果 iPod 音乐播放器是在后台创建的,则它不会发送通知

php - Yii 2 替换 CSecurityManager 类

c++ - Mongodb insert_many 性能 - C++

python - 暂停和恢复功能

SVN + Veracrypt + Dropbox?

Java 2D 游戏照明, 'problem' 带 alpha

java - 使用elasticsearchoperations与elasticsearchtemplate有什么区别?

java - 防止 LibGDX 游戏在暂停时完全停止