From 2effa0a37cf64e319b48ff99bfbda1ee792c2cd8 Mon Sep 17 00:00:00 2001 From: Karl von Randow Date: Thu, 26 Mar 2026 08:43:41 +1300 Subject: [PATCH] Fix thread-safety issues in VAppearances initialization Make initialize() synchronized to prevent a race condition where multiple threads could trigger double-initialization. Mark isInitialized, isLoaded, isEffectiveAppearanceSupported, and DEBUG_FLAG as volatile to ensure cross-thread visibility. --- src/org/violetlib/vappearances/VAppearances.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/org/violetlib/vappearances/VAppearances.java b/src/org/violetlib/vappearances/VAppearances.java index 4780c6e..310786e 100644 --- a/src/org/violetlib/vappearances/VAppearances.java +++ b/src/org/violetlib/vappearances/VAppearances.java @@ -105,16 +105,16 @@ private VAppearances() // public final static @NotNull String highContrastVibrantLightAppearance = "NSAppearanceNameAccessibilityHighContrastVibrantLight"; // public final static @NotNull String highContrastVibrantDarkAppearance = "NSAppearanceNameAccessibilityHighContrastVibrantDark"; - private static boolean isInitialized; - private static boolean isLoaded; - private static boolean isEffectiveAppearanceSupported; + private static volatile boolean isInitialized; + private static volatile boolean isLoaded; + private static volatile boolean isEffectiveAppearanceSupported; /** Keeps the data for known appearances */ private static final @NotNull AppearanceDataCache appearanceDataCache = new AppearanceDataCache(); - private static boolean DEBUG_FLAG = false; + private static volatile boolean DEBUG_FLAG = false; - private static void initialize() + private static synchronized void initialize() { if (!isInitialized) { isInitialized = true;