users of the [concurrent]{} object. [Concurrent]{} objects will use [synchronized]{} types for synchronizing data access. Several memory models are provided for doing this efficiently. It is the responsibility of the programmer to ensure that the entries of a [concurrent]{} object are free from data races (DRF). For such programs, the non-blocking semantics of a [concurrent]{} object will provide SC in the same way as protected objects do for blocking synchronization.

[Synchronizing memory operations and enforcing ordering]{}

For defining ordering relations on memory operations, it is useful to introduce some other useful relations.

The [*synchronizes-with*]{} relation can be achieved only by use of atomic types. Even if monitors or protected objects are used for synchronization, the runtime implements them employing atomic types. The general idea is to equip read and write operations on an atomic variable with information that will enforce an ordering on the read and write operations. Our proposal is to use attributes for specifying this ordering information. Details can be found below.

The [*happens-before*]{} relation is the basic relation for ordering operations in programs. In a program consisting of only one single thread, happens-before is straightforward. For inter-thread happens-before relations the synchronizes-with relation becomes important. If operation [X]{} 