On Sun, Sep 18, 2022 at 9:24 AM Antonio Rafael Rodrigues <
[email protected]> wrote:

> Hello
>
> I have two questions.
>
> 1)
> As we can see in the source code of AtomicLong, there should be a
> difference between calling set and lazySet, given that *set* calls
> Unsafe.putLongVolatile and *lazySet* calls Unsafe.putLongRelease, but
> looking at Unsafe source code, we can see that Unsafe.putLongRelease simply
> calls Unsafe.putLongVolatile.
> So, may I conclude that calling set and lazySet on AtomicLong have the
> same affects?
>

A putLongRelease has much weaker semantics than a putLongVolatile.

A putLongRelease store can be reordered with a newer load to a different
address. On the X86 this can happen due to store buffers.

A putLongVolatile can't be reordered with a newer load to a different
address. On the X86 using e.g. an MFENCE after the store or a cheaper lock
prefixed instruction like 'lock addl $0x0,(%rsp)'  does the trick. See the
following post for more detail:

https://web.archive.org/web/20110620202202/https://blogs.oracle.com/dave/entry/instruction_selection_for_volatile_fences

Apart from that, the compiler is also more constrained with a volatile
store compared to a release store.

Even though the code in the Unsafe for both methods is the same (since
something weaker can always be upgraded to something more restrictive) they
will lead to different machine code due to different intrensics. So what
you see in Unsafe is not what is actually being used to generate machine
instructions.


>
> 2)
> In AtomicInteger class, set just sets a value in a volatile variable, and
> lazySet calls Unsafe.putIntRelease, this one calls putIntVolatile.
> Question: putIntVolatile has the same effects of setting a volatile
> variable (I think so),
>

Yes


> If yes, can we say that set and lazySet on AtomicInteger have the same
> effects?
>

No. lazySet has same semantics as a release store and hence is much weaker
than a set (which is equal to a volatile store).

>
> Thanks
>

Make a JMH test and have a look at the generated assembly and you will see
the difference between a volatile store and a release store.


>
>
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "mechanical-sympathy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web, visit
> https://groups.google.com/d/msgid/mechanical-sympathy/CADkjdv8vbF%2B3d9Am5diRmcJ-1Sbix%2BPqXB5AfhE%2B%3DapzKP2LAw%40mail.gmail.com
> <https://groups.google.com/d/msgid/mechanical-sympathy/CADkjdv8vbF%2B3d9Am5diRmcJ-1Sbix%2BPqXB5AfhE%2B%3DapzKP2LAw%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"mechanical-sympathy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web, visit 
https://groups.google.com/d/msgid/mechanical-sympathy/CAGuAWdC7BhvE2aWHVRvtfNXGVsHxMd_0BsUjfhZ7wG5H35%2Bmwg%40mail.gmail.com.

Reply via email to