On Tue, 29 Jun 2021 18:47:23 GMT, Daniel Fuchs <dfu...@openjdk.org> wrote:
>> Add a cache to record which sources have called `System::setSecurityManager` >> and only print out warning lines once for each. > > src/java.base/share/classes/java/lang/System.java line 337: > >> 335: = Collections.synchronizedMap(new WeakHashMap<>()); >> 336: } >> 337: > > I wonder about the use of a WeakHashMap here. That may work well when the > source is an interned string (a class name) which will be strongly referenced > elsewhere and may be garbage collected if the class is unloaded, but in the > case where it contains the name of the source jar then that string will only > be referenced by the weak hashmap, and therefore it could be garbage > collected any time - which would cause the mapping to be removed. In that > case you cannot guarantee that the warning will be emitted only once. Using a HashSet<Class> could use the callerClass as the key and be a stable reference for having given the message. or use a ConcurrentHashMap<Class<?>>, boolean> and avoid any separate synchronization that would be needed with a HashSet or HashMap. ------------- PR: https://git.openjdk.java.net/jdk17/pull/166