就内存而言,没有范围限制。当您具有读取或写入障碍时,它将应用于所有内存读取/写入。
我看到的限制是内存映射。当您对文件进行内存映射时,必须小心如何将其提供给另一个线程使用,因为这个新的内存映射在另一个线程中可能不可见,从而立即导致BUS错误(并导致JVM崩溃)。
OS漏洞(作为Linux和Windows的最新版本)似乎没有此问题。
这意味着在下面的代码中,两个运行method()的线程离开同步块将把staticVar2刷新到另一个线程,而不是staticVar1,对吗?
可能会更早地在staticVar2时刷新statixVar1。无法保证时间,但是可以保证订购。
如果线程A执行方法,则稍后线程B执行method2(),即使两个线程不在同一锁上同步,staticVar2的值是否也从A发布到B?
是的,所使用的锁与事前保证无关紧要。
易失性读写会将所有内存刷新到所有线程,还是仅在两个访问线程之间?不管是哪个答案,所有内存都是刷新的还是仅是可变变量?
所有脏内存都在写屏障上被刷新,所有读将在读屏障上保持顺序一致。
volatile同时执行写屏障和读屏障。
退出同步块时,是否会清除所有已更改的内存,或者仅清除该块内已更改的内存?
该线程更改了所有内存。
是否必须同步两个线程访问的所有静态变量?
仅当一个线程修改了变量时。任何数量的线程都可以读取静态值而无需同步。



