'synchronized barriers' 是什么?

What are the 'synchronized barriers'?

最近我正在阅读页面 The JSR-133 Cookbook for Compiler Writers by Doug Lea regarding JSR 133: JavaTM Memory Model and Thread Specification Revision

我读到这行:

Memory barriers are not themselves "synchronization barriers"

我搜索了一些有关 内存屏障 同步屏障 之间差异的资源,但找不到任何有用的资源。我也不知道 synchronized barriers 与 Java 与其他语言相比是否有任何区别。

首先,正如@markspace 指出的那样,您正在查看的文档并非旨在作为 Java 试图了解如何正确编写线程代码的程序员的文档。

"This is an unofficial guide to implementing the new Java Memory Model (JMM)"

因此,如果您为此目的阅读它,您可能会不必要地混淆自己。您应该改为使用 Java 的更高级别的并发机制(最好!),或者阅读和理解 JMM 规范。


同步屏障(不是“同步屏障”)(我相信)指的是术语 Java 内存模型。

JLS 17.4.4 定义各种动作之间的 synchronizes-with 关系。这种关系意味着两个线程之间的同步:

The source of a synchronizes-with edge is called a release, and the destination is called an acquire.

我不确定(因为 Cookbook 文档没有详细说明),但我认为 Cookbook 中的“同步障碍”指的是物理实现一个 边缘同步......无论它是什么。

所以文档这里说的是它所指的内存屏障和实现锁等的机制不是一回事。这真的很明显。

看名字...... for compiler writers,这个应该就清楚了。 Doug Lea 和其他人一起构建了一个草稿文档(一个起点),编译器编写者可以从中着手。

问题是 JVM 可以超越或完全忽略该文件,只要那是合法的。例如:

public void go() {
    
     synchronized(this) {
        int x = 1;
     }

     synchronized(this) {
        int y = 2;
     }

}

那个文档说会插入“内存屏障”,基本上x = 1y = 2不能移到synchronized块之外。实际上,JVM 会做:

   public void go() {
    
     synchronized(this) {
        int x = 1;
        int y = 2;
     }

}

这是一种称为“锁粗化”的优化,没有任何问题。因此,该文档实际上只是定义一些基本规则的起点。

“同步障碍”是指this chapter;并且它定义了正确“同步”访问共享变量以使适当的记忆效应生效的规则。