【发布时间】:2020-04-15 17:45:58
【问题描述】:
我在某处读到每个线程都有自己的共享状态副本,即使我使用同步或锁来修改变量,什么保证更改的状态将被刷新到主内存而不是线程自己的内存中高速缓存。
我知道 volatile 保证并证明上述情况是合理的,即使我也知道同步证明也是合理的。
同步如何保证更改值发生在主内存而不是线程缓存内存中。
前线程 1
synchronized(this)
{
int a = 0;
a = 5;
} ----> the value might got changed in thread's cache memory another thread entering the block could read a value as 0
volatilte int a = 0;
a = 5; ----> another executing thread will read a values as 5
【问题讨论】:
-
请注意,@CodeScale 的答案没有使用“自己的副本”这个短语。 Java 语言规范 (JLS) 也没有。它也没有说“缓存”或“主内存”。 JLS 描述了一种理想化的虚构 Java 机器,其中每个变量都只存在于一个地方。但是当两个或多个线程共享变量时,JLS 只承诺如果程序遵循某些规则,他们将“看到”它们的一致视图。在任何真正的 Java 实现中,变量的缓存副本都是真实存在的,但是在决定程序是否遵守其规则时,您应该采用 JLS 的语言。
标签: java multithreading concurrency synchronization