In general I don't disagree.

There is, however, at least _some_ cases where the imperative API is less difficult to use.


In some cases you know that a class has a complex lifecycle -- perhaps it starts off in a simple "larval" state, where the instance only exist in a single thread.


In this state, it's possible for the class to receive state updates. If parts of the class state are stable, using `trySet` might work very well. Perhaps only "friends" of this class can call such mutator methods on the larval instance.


At some point later in the class lifetime, it becomes "frozen", and it is published to multiple threads.


Of course, this is a corner case -- but if our goal is to model what `@Stable` can do, while surely a stable supplier, or using `orElseSet` are better no-worry alternatives to get there, there remain a number of use cases that would not be expressible if all we had was the high-level API. In a way, a big part of what this new API does is that it finds the right set of primitives, upon which we can build all the other interesting high-level stuff.


I think your complaint is not that the primitive is wrong, but that in calling the primitive StableValue we're giving the "good name" to the stuff that is less likely to be widely used.


(Note: a very minimalistic API approach -- which we considered -- would have been to just provide extra stable factories in Supplier/Function/IntFunction/List/Map and call it a day)


Maurizio


On 03/04/2025 12:20, Per-Ake Minborg wrote:
Hi Remi and thank you for the feedback from JChateau (what a wonderful name!).

This is one of the issues we already have on the list for the next round of preview. Now we know more folks are on the same page.

Best, Per
------------------------------------------------------------------------
*From:* Remi Forax <fo...@univ-mlv.fr>
*Sent:* Wednesday, April 2, 2025 4:33 PM
*To:* Per Minborg <pminb...@openjdk.org>
*Cc:* compiler-dev <compiler-...@openjdk.org>; core-libs-dev <core-libs-dev@openjdk.org>; hotspot-dev <hotspot-...@openjdk.org>; security-dev <security-...@openjdk.org>
*Subject:* Re: RFR: 8351565: Implement JEP 502: Stable Values (Preview)
Hi Per,
last week, at JChateau, we had a one hour session about stable values, I've build the JDK with this PR so we can discuss about it.

To present the API, i start from the double check locking, rewriting it to use the StableValue API.

The main remark was that methods like orElseSet() or isSet() are hard to used correctly.

In my opinion, the current API is a mix of a high level API and a low-level API but it's too easy to misuse the low-level API.


high level:
- methods supplier(), list() and map()
  Those are easy to use

low level:
- methods: of, of(value), orElseSet, setOrThrow(), etc
  Those are hard to use properly.

I think, not necessary in this PR, that the current API should be separated into two different classes, one in java.lang with the high level API (the static methods other than Of() and one in java.util.concurrent with the low level API where you have to know what you are doing (like with any classes of java.util.concurrent).

regards,
Rémi

----- Original Message -----
> From: "Per Minborg" <pminb...@openjdk.org>
> To: "compiler-dev" <compiler-...@openjdk.org>, "core-libs-dev" <core-libs-dev@openjdk.org>, "hotspot-dev"
> <hotspot-...@openjdk.org>, "security-dev" <security-...@openjdk.org>
> Sent: Thursday, March 13, 2025 12:20:10 PM
> Subject: RFR: 8351565: Implement JEP 502: Stable Values (Preview)

> Implement JEP 502.
>
> The PR passes tier1-tier3 tests.
>
> -------------
>
> Commit messages:
> - Use acquire semantics for reading rather than volatile semantics
> - Add missing null check
> - Simplify handling of sentinel, wrap, and unwrap
> - Fix JavaDoc issues
> - Fix members in StableEnumFunction
> - Address some comments in the PR
> - Merge branch 'master' into implement-jep502
> - Revert change
> - Fix copyright issues
> - Update JEP number
> - ... and 231 more: https://git.openjdk.org/jdk/compare/4cf63160...09ca44e6
>
> Changes: https://git.openjdk.org/jdk/pull/23972/files
>  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=23972&range=00 <https://webrevs.openjdk.org/?repo=jdk&pr=23972&range=00>
>  Issue: https://bugs.openjdk.org/browse/JDK-8351565
>  Stats: 3980 lines in 30 files changed: 3949 ins; 18 del; 13 mod
>  Patch: https://git.openjdk.org/jdk/pull/23972.diff
>  Fetch: git fetch https://git.openjdk.org/jdk.git pull/23972/head:pull/23972
>
> PR: https://git.openjdk.org/jdk/pull/23972

Reply via email to