Details
-
Bug
-
Status: Reopened
-
Minor
-
Resolution: Fixed
-
None
-
None
-
None
-
New
Description
There is race condition in SetOnce that can cause code below fail with NullPointerException:
SetOnce<String> setOnce = new SetOnce<>(); new Thread(() -> setOnce.set("thread")).start(); try{ setOnce.set("main"); } catch (SetOnce.AlreadySetException e){ setOnce.get().hashCode(); //possible NPE! }
This is caused by 2 separate write operations - 1 for set marker field and 1 for actual object. So it's possible that marker is already set to true (causing AlreadySetException on second write attempt) but object is still not set (causing NullPointerException).
This can be avoided by using single AtomicReference instead to serve both purposes.
Attachments
Issue Links
- links to