说这static意味着所有对象的值的volatile一个副本并且意味着所有线程的值的一个副本是否正确?
无论如何,static变量值也将成为所有线程的一个值,那么我们为什么要这样做volatile呢?
我正在尝试理解Java的volatile关键字,以便在具有CPU缓存的多线程程序中写入易失性原子变量.
我已经阅读了几个教程和Java语言规范,特别是关于"在订购之前发生"的第17.4.5节.我的理解是,当线程将新值写入volatile变量时,更新的值必须对读取该变量的其他线程可见.对我来说,这些语义可以通过以下两种方式之一实现:
线程可以在CPU缓存中缓存volatile变量,但是必须立即将对缓存中的变量的写入刷新到主存储器.换句话说,缓存是直写的.
线程永远不能缓存volatile变量,必须在主内存中读写这些变量.
本教程(http://tutorials.jenkov.com)中提到的方法1 说:
通过声明计数器变量volatile,对计数器变量的所有写操作都将立即写回主存储器.
方法2在Stackoverflow问题" Java中的易失性变量 "中提到,本教程还提到:
这个变量的值永远不会被线程本地缓存:所有读写都将直接进入"主存"
哪一个是Java中使用的正确方法?
相关的Stackoverflow问题没有回答我的问题: