8317538: Potential bottleneck in Provider::getService: specjvm2008::crypto.rsa have scalability issue for high vCPU numbers

Reviewed-by: ascarpino
This commit is contained in:
Vladimir Ivanov 2024-11-21 17:54:45 +00:00 committed by Derek White
parent 6113fa7503
commit 4956a76621

View File

@ -1157,10 +1157,10 @@ public abstract class Provider extends Properties {
public Service getService(String type, String algorithm) { public Service getService(String type, String algorithm) {
checkInitialized(); checkInitialized();
// avoid allocating a new ServiceKey object if possible // avoid allocating a new ServiceKey object if possible
ServiceKey key = previousKey; ServiceKey key = previousKey.get();
if (!key.matches(type, algorithm)) { if (!key.matches(type, algorithm)) {
key = new ServiceKey(type, algorithm, false); key = new ServiceKey(type, algorithm, false);
previousKey = key; previousKey.set(key);
} }
Service s = serviceMap.get(key); Service s = serviceMap.get(key);
@ -1188,8 +1188,8 @@ public abstract class Provider extends Properties {
// re-use will occur e.g. as the framework traverses the provider // re-use will occur e.g. as the framework traverses the provider
// list and queries each provider with the same values until it finds // list and queries each provider with the same values until it finds
// a matching service // a matching service
private static volatile ServiceKey previousKey = private static final ThreadLocal<ServiceKey> previousKey =
new ServiceKey("", "", false); ThreadLocal.withInitial(() -> new ServiceKey("","", false));
/** /**
* Get an unmodifiable Set of all services supported by * Get an unmodifiable Set of all services supported by