On Thu, 2 Jun 2022 00:32:29 GMT, Sergey Bylokhov <s...@openjdk.org> wrote:
>> The IDE warning was changed based on the article above. Did you have a >> chance to reproduce a possible race caused by data change after the size() >> was called? > > I can reproduce it by this code example: > > class Scratch { > > static volatile Throwable failed; > static volatile long endtime; > > public static void main(String[] args) throws Exception { > if (!SystemTray.isSupported()) { > return; // passed if SystemTray is not supported > } > SystemTray st = SystemTray.getSystemTray(); > > endtime = System.nanoTime() + TimeUnit.SECONDS.toNanos(5); > > Thread thread1 = new Thread(() -> { > while (!isComplete()) { > try { > st.add(new TrayIcon(new BufferedImage(10, 10, > > BufferedImage.TYPE_INT_ARGB))); > } catch (AWTException e) { > failed = e; > } > } > }); > Thread thread2 = new Thread(() -> { > while (!isComplete()) { > try { > st.add(new TrayIcon(new BufferedImage(10, 10, > > BufferedImage.TYPE_INT_ARGB))); > } catch (AWTException e) { > failed = e; > } > } > }); > Thread thread3 = new Thread(() -> { > while (!isComplete()) { > TrayIcon[] icons = st.getTrayIcons(); > if (icons.length > 0) { > st.remove(icons[0]); > } > } > }); > Thread thread4 = new Thread(() -> { > while (!isComplete()) { > TrayIcon[] icons = st.getTrayIcons(); > if (icons.length > 0 && icons[icons.length - 1] == null) { > failed = new RuntimeException( > "icon is null:" + Arrays.toString(icons)); > } > } > }); > thread1.start(); > thread2.start(); > thread3.start(); > thread4.start(); > thread1.join(); > thread2.join(); > thread3.join(); > thread4.join(); > for (TrayIcon icon : st.getTrayIcons()) { > st.remove(icon); // cleanup > } > if (failed != null) { > System.err.println("Test failed"); > throw new RuntimeException(failed); > } > } > > private static boolean isComplete() { > return endtime - System.nanoTime() < 0 || failed != null; > } > } BTW I think that the usage of `return icons.toArray(EMPTY_TRAY_ARRAY);` is slower than any of other cases: presized or zero. So if we would like to use a similar pattern the zero version is better. ------------- PR: https://git.openjdk.java.net/jdk/pull/8850