gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:51:21 31 4
gpt4 key购买 nike

许多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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com