Java Concurrency in Practice 声明如下:
当线程 A 执行一个同步块,随后线程 B 进入一个由同一个锁保护的同步块时,在释放锁之前对A 可见的变量值保证在获取锁时对 B 可见。换句话说,当 B 执行由同一锁保护的同步块时,A 在同步块中或之前所做的一切对 B 都是可见的。没有同步,就没有这样的保证。
同样的逻辑适用于 volatile 变量:
volatile 变量的可见性影响超出了 volatile 变量本身的值。当线程 A 写入一个 volatile 变量,随后线程 B 读取同一个变量时,在写入 volatile 变量之前对 A 可见的所有变量的值在读取该 volatile 变量后对 B 可见。
从描述中可以清楚地看出,当您需要访问某些共享状态时,您可以使用这种可见性效果来实际替换(或限制使用)传统锁。在图中的示例中,您可以看到线程 B 可以安全地读取变量y
,即使它在同步块外的线程 A 中发生了更改。
因此,当您在线程上锁定之前更改某些共享状态时使用它是否安全visibility guarantee
,然后获取锁定,做某事(或者什么都不做,我猜),释放锁然后在另一个线程中获得相同的锁锁定,释放它,然后安全地从第一个线程中更新的共享变量中读取最新值?
扬帆大鱼
白板的微信
相关分类