Неплохой, хоть и весьма специфичный доклад про то, какие есть варианты семантик в java, кроме happens-before: plain, opaque, acquire-release. В основном они нужны в случаях, когда гарантии от volatile слишком сильные, и за счет использования более слабых семантик можно получить прирост производительности. Ну или если вы хотите унизить кого-нибудь на собесе, кто вам задает вопросы про многопоточность для вакансии перекладывателя json-ов.

В докладе обсуждается, что такое семантика вообще, кратко повторяется база, и показано иерархическое различие разных семантик. Ко всему есть наглядные примеры.

Вообще в этом контексте вспоминается более фундаментальная статья про модели памяти, о которой я писал ранее.