On Thu, 29 Aug 2024 04:09:18 GMT, Abhishek Kumar <[email protected]> wrote:

> > What's the benefit of removing synchronized from the get call?
> 
> As I mentioned earlier, `ICONS_MAP` are initialized only in **static block** 
> and after that it is just referenced to access the value out of it. Even 
> though `ICONS_MAP` are accessed simultaneously for read operation by multiple 
> threads, it won't lead to any inconsistent state. So, the use of Synchronized 
> look unnecessary to me and the removal of Synchronized shouldn't affect the 
> object state in multi threaded environment.

I agree with @turbanoff's evaluation in [the bug 
description](https://bugs.openjdk.org/browse/JDK-8308588#descriptionmodule): <q 
cite="https://bugs.openjdk.org/browse/JDK-8308588#descriptionmodule";>As this 
map is read-only and _all its content is initialized in `clinit`_, we can 
safely remove `synchronized` from `get` call</q>.

We may go further and make `ICONS_MAP` unmodifiable map:


        Map<String,GTKStockIcon> iconsMap = new HashMap<>();
        iconsMap.put("FileChooser.cancelIcon", new GTKStockIcon("gtk-cancel", 
4));
        iconsMap.put("FileChooser.okIcon",     new GTKStockIcon("gtk-ok",     
4));
        iconsMap.put("OptionPane.yesIcon", new GTKStockIcon("gtk-yes", 4));
        iconsMap.put("OptionPane.noIcon", new GTKStockIcon("gtk-no", 4));
        iconsMap.put("OptionPane.cancelIcon", new GTKStockIcon("gtk-cancel", 
4));
        iconsMap.put("OptionPane.okIcon", new GTKStockIcon("gtk-ok", 4));
        ICONS_MAP = Collections.unmodifiableMap(iconsMap);


This guarantees that `ICONS_MAP` cannot be modified; additionally the map is 
fully initialised by the time it's assigned to `ICONS_MAP` member.

Alternatively, as IDEA suggests, `Map.of` can be used instead:


        ICONS_MAP = Map.of(
                "FileChooser.cancelIcon", new GTKStockIcon("gtk-cancel", 4),
                "FileChooser.okIcon", new GTKStockIcon("gtk-ok", 4),
                "OptionPane.yesIcon", new GTKStockIcon("gtk-yes", 4),
                "OptionPane.noIcon", new GTKStockIcon("gtk-no", 4),
                "OptionPane.cancelIcon", new GTKStockIcon("gtk-cancel", 4),
                "OptionPane.okIcon", new GTKStockIcon("gtk-ok", 4));

-------------

PR Comment: https://git.openjdk.org/jdk/pull/20741#issuecomment-2317527619

Reply via email to