https://davekilian.com/acquire-release.html
is a great introduction to acquire-release semantics, or
"how your ARM CPU really thinks about memory fences".
(hint: there are two half-fences rather than one full fence).
I had to learn about them to keep the race detector happy while
hacking on channels. I'm not sure why the race detector
does not see the mutex locks in the runtime, but for some
reason it needs to explicitly be told about the effects the
channel locks in runtime/chan.go have, or else it will raise false alarms.