8297195: AWTAccessor and SwingAccessor should avoid double racy reads from non-volatile fields

Reviewed-by: azvegint, prr
This commit is contained in:
Sergey Bylokhov 2022-11-19 04:40:02 +00:00
parent 906f1ca4d7
commit c50a9047b4
2 changed files with 150 additions and 82 deletions

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2008, 2021, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -874,11 +874,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.Component class. * Retrieve the accessor object for the java.awt.Component class.
*/ */
public static ComponentAccessor getComponentAccessor() { public static ComponentAccessor getComponentAccessor() {
if (componentAccessor == null) { var access = componentAccessor;
if (access == null) {
ensureClassInitialized(Component.class); ensureClassInitialized(Component.class);
access = componentAccessor;
} }
return access;
return componentAccessor;
} }
/* /*
@ -892,11 +893,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.Container class. * Retrieve the accessor object for the java.awt.Container class.
*/ */
public static ContainerAccessor getContainerAccessor() { public static ContainerAccessor getContainerAccessor() {
if (containerAccessor == null) { var access = containerAccessor;
if (access == null) {
ensureClassInitialized(Container.class); ensureClassInitialized(Container.class);
access = containerAccessor;
} }
return access;
return containerAccessor;
} }
/* /*
@ -910,10 +912,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.Window class. * Retrieve the accessor object for the java.awt.Window class.
*/ */
public static WindowAccessor getWindowAccessor() { public static WindowAccessor getWindowAccessor() {
if (windowAccessor == null) { var access = windowAccessor;
if (access == null) {
ensureClassInitialized(Window.class); ensureClassInitialized(Window.class);
access = windowAccessor;
} }
return windowAccessor; return access;
} }
/* /*
@ -927,10 +931,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.AWTEvent class. * Retrieve the accessor object for the java.awt.AWTEvent class.
*/ */
public static AWTEventAccessor getAWTEventAccessor() { public static AWTEventAccessor getAWTEventAccessor() {
if (awtEventAccessor == null) { var access = awtEventAccessor;
if (access == null) {
ensureClassInitialized(AWTEvent.class); ensureClassInitialized(AWTEvent.class);
access = awtEventAccessor;
} }
return awtEventAccessor; return access;
} }
/* /*
@ -944,10 +950,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.event.InputEvent class. * Retrieve the accessor object for the java.awt.event.InputEvent class.
*/ */
public static InputEventAccessor getInputEventAccessor() { public static InputEventAccessor getInputEventAccessor() {
if (inputEventAccessor == null) { var access = inputEventAccessor;
if (access == null) {
ensureClassInitialized(InputEvent.class); ensureClassInitialized(InputEvent.class);
access = inputEventAccessor;
} }
return inputEventAccessor; return access;
} }
/* /*
@ -961,10 +969,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.event.MouseEvent class. * Retrieve the accessor object for the java.awt.event.MouseEvent class.
*/ */
public static MouseEventAccessor getMouseEventAccessor() { public static MouseEventAccessor getMouseEventAccessor() {
if (mouseEventAccessor == null) { var access = mouseEventAccessor;
if (access == null) {
ensureClassInitialized(MouseEvent.class); ensureClassInitialized(MouseEvent.class);
access = mouseEventAccessor;
} }
return mouseEventAccessor; return access;
} }
/* /*
@ -978,10 +988,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.Frame class. * Retrieve the accessor object for the java.awt.Frame class.
*/ */
public static FrameAccessor getFrameAccessor() { public static FrameAccessor getFrameAccessor() {
if (frameAccessor == null) { var access = frameAccessor;
if (access == null) {
ensureClassInitialized(Frame.class); ensureClassInitialized(Frame.class);
access = frameAccessor;
} }
return frameAccessor; return access;
} }
/* /*
@ -995,10 +1007,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.KeyboardFocusManager class. * Retrieve the accessor object for the java.awt.KeyboardFocusManager class.
*/ */
public static KeyboardFocusManagerAccessor getKeyboardFocusManagerAccessor() { public static KeyboardFocusManagerAccessor getKeyboardFocusManagerAccessor() {
if (kfmAccessor == null) { var access = kfmAccessor;
if (access == null) {
ensureClassInitialized(KeyboardFocusManager.class); ensureClassInitialized(KeyboardFocusManager.class);
access = kfmAccessor;
} }
return kfmAccessor; return access;
} }
/* /*
@ -1012,10 +1026,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.MenuComponent class. * Retrieve the accessor object for the java.awt.MenuComponent class.
*/ */
public static MenuComponentAccessor getMenuComponentAccessor() { public static MenuComponentAccessor getMenuComponentAccessor() {
if (menuComponentAccessor == null) { var access = menuComponentAccessor;
if (access == null) {
ensureClassInitialized(MenuComponent.class); ensureClassInitialized(MenuComponent.class);
access = menuComponentAccessor;
} }
return menuComponentAccessor; return access;
} }
/* /*
@ -1029,10 +1045,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.EventQueue class. * Retrieve the accessor object for the java.awt.EventQueue class.
*/ */
public static EventQueueAccessor getEventQueueAccessor() { public static EventQueueAccessor getEventQueueAccessor() {
if (eventQueueAccessor == null) { var access = eventQueueAccessor;
if (access == null) {
ensureClassInitialized(EventQueue.class); ensureClassInitialized(EventQueue.class);
access = eventQueueAccessor;
} }
return eventQueueAccessor; return access;
} }
/* /*
@ -1046,10 +1064,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.PopupMenu class. * Retrieve the accessor object for the java.awt.PopupMenu class.
*/ */
public static PopupMenuAccessor getPopupMenuAccessor() { public static PopupMenuAccessor getPopupMenuAccessor() {
if (popupMenuAccessor == null) { var access = popupMenuAccessor;
if (access == null) {
ensureClassInitialized(PopupMenu.class); ensureClassInitialized(PopupMenu.class);
access = popupMenuAccessor;
} }
return popupMenuAccessor; return access;
} }
/* /*
@ -1063,10 +1083,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.FileDialog class. * Retrieve the accessor object for the java.awt.FileDialog class.
*/ */
public static FileDialogAccessor getFileDialogAccessor() { public static FileDialogAccessor getFileDialogAccessor() {
if (fileDialogAccessor == null) { var access = fileDialogAccessor;
if (access == null) {
ensureClassInitialized(FileDialog.class); ensureClassInitialized(FileDialog.class);
access = fileDialogAccessor;
} }
return fileDialogAccessor; return access;
} }
/* /*
@ -1081,10 +1103,12 @@ public final class AWTAccessor {
* class. * class.
*/ */
public static ScrollPaneAdjustableAccessor getScrollPaneAdjustableAccessor() { public static ScrollPaneAdjustableAccessor getScrollPaneAdjustableAccessor() {
if (scrollPaneAdjustableAccessor == null) { var access = scrollPaneAdjustableAccessor;
if (access == null) {
ensureClassInitialized(ScrollPaneAdjustable.class); ensureClassInitialized(ScrollPaneAdjustable.class);
access = scrollPaneAdjustableAccessor;
} }
return scrollPaneAdjustableAccessor; return access;
} }
/** /**
@ -1098,10 +1122,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.CheckboxMenuItem class. * Retrieve the accessor object for the java.awt.CheckboxMenuItem class.
*/ */
public static CheckboxMenuItemAccessor getCheckboxMenuItemAccessor() { public static CheckboxMenuItemAccessor getCheckboxMenuItemAccessor() {
if (checkboxMenuItemAccessor == null) { var access = checkboxMenuItemAccessor;
if (access == null) {
ensureClassInitialized(CheckboxMenuItemAccessor.class); ensureClassInitialized(CheckboxMenuItemAccessor.class);
access = checkboxMenuItemAccessor;
} }
return checkboxMenuItemAccessor; return access;
} }
/** /**
@ -1115,10 +1141,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.Cursor class. * Retrieve the accessor object for the java.awt.Cursor class.
*/ */
public static CursorAccessor getCursorAccessor() { public static CursorAccessor getCursorAccessor() {
if (cursorAccessor == null) { var access = cursorAccessor;
if (access == null) {
ensureClassInitialized(CursorAccessor.class); ensureClassInitialized(CursorAccessor.class);
access = cursorAccessor;
} }
return cursorAccessor; return access;
} }
/** /**
@ -1132,10 +1160,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.MenuBar class. * Retrieve the accessor object for the java.awt.MenuBar class.
*/ */
public static MenuBarAccessor getMenuBarAccessor() { public static MenuBarAccessor getMenuBarAccessor() {
if (menuBarAccessor == null) { var access = menuBarAccessor;
if (access == null) {
ensureClassInitialized(MenuBarAccessor.class); ensureClassInitialized(MenuBarAccessor.class);
access = menuBarAccessor;
} }
return menuBarAccessor; return access;
} }
/** /**
@ -1149,10 +1179,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.MenuItem class. * Retrieve the accessor object for the java.awt.MenuItem class.
*/ */
public static MenuItemAccessor getMenuItemAccessor() { public static MenuItemAccessor getMenuItemAccessor() {
if (menuItemAccessor == null) { var access = menuItemAccessor;
if (access == null) {
ensureClassInitialized(MenuItemAccessor.class); ensureClassInitialized(MenuItemAccessor.class);
access = menuItemAccessor;
} }
return menuItemAccessor; return access;
} }
/** /**
@ -1166,10 +1198,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.Menu class. * Retrieve the accessor object for the java.awt.Menu class.
*/ */
public static MenuAccessor getMenuAccessor() { public static MenuAccessor getMenuAccessor() {
if (menuAccessor == null) { var access = menuAccessor;
if (access == null) {
ensureClassInitialized(MenuAccessor.class); ensureClassInitialized(MenuAccessor.class);
access = menuAccessor;
} }
return menuAccessor; return access;
} }
/** /**
@ -1183,10 +1217,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.event.KeyEvent class. * Retrieve the accessor object for the java.awt.event.KeyEvent class.
*/ */
public static KeyEventAccessor getKeyEventAccessor() { public static KeyEventAccessor getKeyEventAccessor() {
if (keyEventAccessor == null) { var access = keyEventAccessor;
if (access == null) {
ensureClassInitialized(KeyEventAccessor.class); ensureClassInitialized(KeyEventAccessor.class);
access = keyEventAccessor;
} }
return keyEventAccessor; return access;
} }
/** /**
@ -1200,10 +1236,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the javax.swing.ClientPropertyKey class. * Retrieve the accessor object for the javax.swing.ClientPropertyKey class.
*/ */
public static ClientPropertyKeyAccessor getClientPropertyKeyAccessor() { public static ClientPropertyKeyAccessor getClientPropertyKeyAccessor() {
if (clientPropertyKeyAccessor == null) { var access = clientPropertyKeyAccessor;
if (access == null) {
ensureClassInitialized(ClientPropertyKeyAccessor.class); ensureClassInitialized(ClientPropertyKeyAccessor.class);
access = clientPropertyKeyAccessor;
} }
return clientPropertyKeyAccessor; return access;
} }
/** /**
@ -1217,10 +1255,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.SystemTray class. * Retrieve the accessor object for the java.awt.SystemTray class.
*/ */
public static SystemTrayAccessor getSystemTrayAccessor() { public static SystemTrayAccessor getSystemTrayAccessor() {
if (systemTrayAccessor == null) { var access = systemTrayAccessor;
if (access == null) {
ensureClassInitialized(SystemTrayAccessor.class); ensureClassInitialized(SystemTrayAccessor.class);
access = systemTrayAccessor;
} }
return systemTrayAccessor; return access;
} }
/** /**
@ -1234,10 +1274,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.TrayIcon class. * Retrieve the accessor object for the java.awt.TrayIcon class.
*/ */
public static TrayIconAccessor getTrayIconAccessor() { public static TrayIconAccessor getTrayIconAccessor() {
if (trayIconAccessor == null) { var access = trayIconAccessor;
if (access == null) {
ensureClassInitialized(TrayIconAccessor.class); ensureClassInitialized(TrayIconAccessor.class);
access = trayIconAccessor;
} }
return trayIconAccessor; return access;
} }
/** /**
@ -1251,10 +1293,12 @@ public final class AWTAccessor {
* Retrieve the accessor object for the java.awt.DefaultKeyboardFocusManager class. * Retrieve the accessor object for the java.awt.DefaultKeyboardFocusManager class.
*/ */
public static DefaultKeyboardFocusManagerAccessor getDefaultKeyboardFocusManagerAccessor() { public static DefaultKeyboardFocusManagerAccessor getDefaultKeyboardFocusManagerAccessor() {
if (defaultKeyboardFocusManagerAccessor == null) { var access = defaultKeyboardFocusManagerAccessor;
if (access == null) {
ensureClassInitialized(DefaultKeyboardFocusManagerAccessor.class); ensureClassInitialized(DefaultKeyboardFocusManagerAccessor.class);
access = defaultKeyboardFocusManagerAccessor;
} }
return defaultKeyboardFocusManagerAccessor; return access;
} }
/* /*
* Set an accessor object for the java.awt.SequencedEvent class. * Set an accessor object for the java.awt.SequencedEvent class.
@ -1267,14 +1311,16 @@ public final class AWTAccessor {
* Get the accessor object for the java.awt.SequencedEvent class. * Get the accessor object for the java.awt.SequencedEvent class.
*/ */
public static SequencedEventAccessor getSequencedEventAccessor() { public static SequencedEventAccessor getSequencedEventAccessor() {
if (sequencedEventAccessor == null) { var access = sequencedEventAccessor;
if (access == null) {
try { try {
ensureClassInitialized( ensureClassInitialized(
Class.forName("java.awt.SequencedEvent")); Class.forName("java.awt.SequencedEvent"));
} catch (ClassNotFoundException ignore) { } catch (ClassNotFoundException ignore) {
} }
access = sequencedEventAccessor;
} }
return sequencedEventAccessor; return access;
} }
/* /*
@ -1288,11 +1334,12 @@ public final class AWTAccessor {
* Get the accessor object for the java.awt.Toolkit class. * Get the accessor object for the java.awt.Toolkit class.
*/ */
public static ToolkitAccessor getToolkitAccessor() { public static ToolkitAccessor getToolkitAccessor() {
if (toolkitAccessor == null) { var access = toolkitAccessor;
if (access == null) {
ensureClassInitialized(Toolkit.class); ensureClassInitialized(Toolkit.class);
access = toolkitAccessor;
} }
return access;
return toolkitAccessor;
} }
/* /*
@ -1313,11 +1360,12 @@ public final class AWTAccessor {
* Get the accessor object for the java.awt.SystemColor class. * Get the accessor object for the java.awt.SystemColor class.
*/ */
public static SystemColorAccessor getSystemColorAccessor() { public static SystemColorAccessor getSystemColorAccessor() {
if (systemColorAccessor == null) { var access = systemColorAccessor;
if (access == null) {
ensureClassInitialized(SystemColor.class); ensureClassInitialized(SystemColor.class);
access = systemColorAccessor;
} }
return access;
return systemColorAccessor;
} }
/* /*
@ -1331,10 +1379,12 @@ public final class AWTAccessor {
* Get the accessor object for the javax.accessibility.AccessibleContext class. * Get the accessor object for the javax.accessibility.AccessibleContext class.
*/ */
public static AccessibleContextAccessor getAccessibleContextAccessor() { public static AccessibleContextAccessor getAccessibleContextAccessor() {
if (accessibleContextAccessor == null) { var access = accessibleContextAccessor;
if (access == null) {
ensureClassInitialized(AccessibleContext.class); ensureClassInitialized(AccessibleContext.class);
access = accessibleContextAccessor;
} }
return accessibleContextAccessor; return access;
} }
/* /*
@ -1348,10 +1398,12 @@ public final class AWTAccessor {
* Get the accessor object for the javax.accessibility.AccessibleBundle class. * Get the accessor object for the javax.accessibility.AccessibleBundle class.
*/ */
public static AccessibleBundleAccessor getAccessibleBundleAccessor() { public static AccessibleBundleAccessor getAccessibleBundleAccessor() {
if (accessibleBundleAccessor == null) { var access = accessibleBundleAccessor;
if (access == null) {
ensureClassInitialized(AccessibleBundle.class); ensureClassInitialized(AccessibleBundle.class);
access = accessibleBundleAccessor;
} }
return accessibleBundleAccessor; return access;
} }
/* /*
@ -1365,10 +1417,12 @@ public final class AWTAccessor {
* Get the accessor object for the java.awt.dnd.DragSourceContext class. * Get the accessor object for the java.awt.dnd.DragSourceContext class.
*/ */
public static DragSourceContextAccessor getDragSourceContextAccessor() { public static DragSourceContextAccessor getDragSourceContextAccessor() {
if (dragSourceContextAccessor == null) { var access = dragSourceContextAccessor;
if (access == null) {
ensureClassInitialized(DragSourceContext.class); ensureClassInitialized(DragSourceContext.class);
access = dragSourceContextAccessor;
} }
return dragSourceContextAccessor; return access;
} }
/* /*
@ -1382,10 +1436,12 @@ public final class AWTAccessor {
* Get the accessor object for the java.awt.dnd.DropTargetContext class. * Get the accessor object for the java.awt.dnd.DropTargetContext class.
*/ */
public static DropTargetContextAccessor getDropTargetContextAccessor() { public static DropTargetContextAccessor getDropTargetContextAccessor() {
if (dropTargetContextAccessor == null) { var access = dropTargetContextAccessor;
if (access == null) {
ensureClassInitialized(DropTargetContext.class); ensureClassInitialized(DropTargetContext.class);
access = dropTargetContextAccessor;
} }
return dropTargetContextAccessor; return access;
} }
/* /*

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2009, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -138,11 +138,12 @@ public final class SwingAccessor {
* Retrieve the accessor object for the javax.swing.JComponent class. * Retrieve the accessor object for the javax.swing.JComponent class.
*/ */
public static JComponentAccessor getJComponentAccessor() { public static JComponentAccessor getJComponentAccessor() {
if (jComponentAccessor == null) { var access = jComponentAccessor;
if (access == null) {
ensureClassInitialized(JComponent.class); ensureClassInitialized(JComponent.class);
access = jComponentAccessor;
} }
return access;
return jComponentAccessor;
} }
/** /**
@ -161,11 +162,12 @@ public final class SwingAccessor {
* Retrieve the accessor object for the javax.swing.text.JTextComponent class. * Retrieve the accessor object for the javax.swing.text.JTextComponent class.
*/ */
public static JTextComponentAccessor getJTextComponentAccessor() { public static JTextComponentAccessor getJTextComponentAccessor() {
if (jtextComponentAccessor == null) { var access = jtextComponentAccessor;
if (access == null) {
ensureClassInitialized(JTextComponent.class); ensureClassInitialized(JTextComponent.class);
access = jtextComponentAccessor;
} }
return access;
return jtextComponentAccessor;
} }
/** /**
@ -184,10 +186,12 @@ public final class SwingAccessor {
* Retrieve the accessor object for the JLightweightFrame class * Retrieve the accessor object for the JLightweightFrame class
*/ */
public static JLightweightFrameAccessor getJLightweightFrameAccessor() { public static JLightweightFrameAccessor getJLightweightFrameAccessor() {
if (jLightweightFrameAccessor == null) { var access = jLightweightFrameAccessor;
if (access == null) {
ensureClassInitialized(JLightweightFrame.class); ensureClassInitialized(JLightweightFrame.class);
access = jLightweightFrameAccessor;
} }
return jLightweightFrameAccessor; return access;
} }
/** /**
@ -206,10 +210,12 @@ public final class SwingAccessor {
* Retrieve the accessor object for the JLightweightFrame class * Retrieve the accessor object for the JLightweightFrame class
*/ */
public static UIDefaultsAccessor getUIDefaultsAccessor() { public static UIDefaultsAccessor getUIDefaultsAccessor() {
if (uiDefaultsAccessor == null) { var access = uiDefaultsAccessor;
if (access == null) {
ensureClassInitialized(UIDefaults.class); ensureClassInitialized(UIDefaults.class);
access = uiDefaultsAccessor;
} }
return uiDefaultsAccessor; return access;
} }
/** /**
@ -228,10 +234,12 @@ public final class SwingAccessor {
* Retrieve the accessor object for the RepaintManager class. * Retrieve the accessor object for the RepaintManager class.
*/ */
public static RepaintManagerAccessor getRepaintManagerAccessor() { public static RepaintManagerAccessor getRepaintManagerAccessor() {
if (repaintManagerAccessor == null) { var access = repaintManagerAccessor;
if (access == null) {
ensureClassInitialized(RepaintManager.class); ensureClassInitialized(RepaintManager.class);
access = repaintManagerAccessor;
} }
return repaintManagerAccessor; return access;
} }
/** /**
@ -243,10 +251,12 @@ public final class SwingAccessor {
* Retrieve the accessor object for the PopupFactory class. * Retrieve the accessor object for the PopupFactory class.
*/ */
public static PopupFactoryAccessor getPopupFactoryAccessor() { public static PopupFactoryAccessor getPopupFactoryAccessor() {
if (popupFactoryAccessor == null) { var access = popupFactoryAccessor;
if (access == null) {
ensureClassInitialized(PopupFactory.class); ensureClassInitialized(PopupFactory.class);
access = popupFactoryAccessor;
} }
return popupFactoryAccessor; return access;
} }
/** /**
@ -265,10 +275,12 @@ public final class SwingAccessor {
* Retrieve the accessor object for the KeyStroke class. * Retrieve the accessor object for the KeyStroke class.
*/ */
public static KeyStrokeAccessor getKeyStrokeAccessor() { public static KeyStrokeAccessor getKeyStrokeAccessor() {
if (keyStrokeAccessor == null) { var access = keyStrokeAccessor;
if (access == null) {
ensureClassInitialized(KeyStroke.class); ensureClassInitialized(KeyStroke.class);
access = keyStrokeAccessor;
} }
return keyStrokeAccessor; return access;
} }
/* /*