to improve performance but without violating memory consistency.

[Generic Release-Acquire Object.]{} Listing \[genRA\] shows how release-acquire semantics can be implemented for general data structures with help of one synchronized Boolean.

[API]{}\[API\_sec\]As already pointed out, we feel that providing concurrent objects as first-class citizens is the right way to enhance Ada with non-blocking synchronization on an adequate memory model. On the other hand, if the programmer needs synchronization on a lower level than [concurrent]{} objects provide, an API-based approach (generic function [Read\_Modify\_Write]{} in package [Memory\_Model]{}) would be a viable alternative. Listing \[packmm\] shows such a predefined package [Memory\_Model]{}. It contains the specification of generic function [Read\_Modify\_Write]{}, which allows to use the read-modify-write operation of the underlying computer hardware[^3]. Exposing sync loops to the programmer makes it necessary to introduce a new aspect [sync\_loop]{} to let the runtime perform the state change to “in\_sync\_loop” (cf. Section \[sched\]). Because nobody can force the programmer to use this aspect correctly, the information transferred to the runtime may be false or incomplete, giving rise to concurrency defects such as deadlocks, livelocks, and other problems.

[Conclusion and Future Work\[sec:concl\]]{}

We have presented an approach for providing safe non-blocking synchronization in Ada 202x. Our novel approach is 