[
https://issues.apache.org/jira/browse/IGNITE-28386?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Vyacheslav Koptilin updated IGNITE-28386:
-----------------------------------------
Ignite Flags: (was: Docs Required,Release Notes Required)
> Lazy<T> fast path does not safely publish the initialized value
> ---------------------------------------------------------------
>
> Key: IGNITE-28386
> URL: https://issues.apache.org/jira/browse/IGNITE-28386
> Project: Ignite
> Issue Type: Bug
> Reporter: Vyacheslav Koptilin
> Assignee: Vyacheslav Koptilin
> Priority: Major
> Labels: ignite-3
>
> Lazy<T>
> (modules/core/src/main/java/org/apache/ignite/internal/util/Lazy.java) uses
> double-checked
> locking with the intent of piggybacking visibility of the non-volatile
> field val on the volatile
> field supplier. This technique is valid only if the volatile read is
> performed before the
> non-volatile read. The current implementation violates this ordering.
>
> In get(), val is read first (line 50) without any volatile access preceding
> it:
> {code:java}
> T v = val; // non-volatile read — no happens-before
> established
> if (v == null) {
>
> if (supplier != EMPTY) { // volatile read — only reached when val is
> null {code}
>
>
> When val is non-null, the fast path returns immediately and never reads
> supplier. This means there is no happens-before relationship between the
> writing thread's store to val and the reading thread's load of val. This is a
> data race: a reading thread may observe a non-null reference in val while the
> object it points to is not fully initialized (some field writes performed
> inside supplier.get() may not yet be visible).
--
This message was sent by Atlassian Jira
(v8.20.10#820010)