On Tue, 23 Nov 2021 02:55:55 GMT, Valerie Peng <[email protected]> wrote:
> It is observed that when running crypto benchmark with large number of
> threads, a lot of time is spent on the synchronized block inside the
> Provider.getService() method. The cause for this is that
> Provider.getService() method first uses the 'serviceMap' field to find the
> requested service. However, when the requested service is not supported by
> this provider, e.g. requesting Cipher.RSA from SUN provider, the impl
> continues to try searching the legacy registrations whose processing is
> guarded by the "synchronized" keyword. When apps use getInstance() calls
> without the provider argument, Provider class has to iterate through existing
> providers trying to find one that supports the requested service.
>
> Now that the parent class of Provider no longer synchronizes all of its
> methods, Provider class should follow suit and de-synchronize its methods.
> Parsing of the legacy registration is done eagerly (at the time of put(...)
> calls) instead of lazily (at the time of getService(...) calls). This also
> makes "legacyStrings" redundant as the registration is parsed and stored
> directly into "legacyMap".
>
> The bug reporter has confirmed that the changes resolve the performance
> bottleneck and all regression tests pass.
>
> Please review and thanks in advance,
> Valerie
src/java.base/share/classes/java/security/Provider.java line 919:
> 917:
> 918: Object o = super.remove(key);
> 919: if (o != null && o instanceof String && key instanceof String) {
`o != null` seems redundant here. `o instanceof String` will be false in case
of `o == null`
-------------
PR: https://git.openjdk.java.net/jdk/pull/6513