"当线程为释放相关监视器而退出一个同步块时,JMM 要求本地处理器缓冲刷新到主存中。(实际上,内存模型不涉及缓存——它涉及一个抽象( 本地内存), 它包围了缓存、注册表和其他硬件和编译优化。)与此类似,作为获得监视的一部分,当进入一个同步块时,本地缓存失效,使之后的读操作直接进入主内存而不是本地缓存。这一过程保证当变量是由一个线程在由给定监视器保护的同步块中写入,并由另一个线程在由同一监视器保护的同步块中读取时,对变量的写可被读线程看到。如果没有同步,则 JMM 不提供这种保证——这就是为什么在多个线程访问同一个变量时,必须使用同步(或者它的更年轻的同胞 volatile )。"我不是特别明白这是什么意思?
解决方案 »
- 关于thinking in java 第四版 提到的协变返回类型
- 关clone问题
- 这句话,直接回车target =(char)System.in.read();如何判断
- jkd1。4。2中自订程序库路径的设置 (散分100)
- java写了一个爬虫,出现Software caused connection abort: recv failed 异常
- 酷鱼转身
- I have a question here, give 100marks if you can give me the code in 2 hours, wait online
- 安装jbuilder出现的问题
- 请问大侠们,你们都用什么编程工具?
- JAVA初学者,请教一个关于包的问题
- 关于线程同步概念问题
- 当点击"查找最大数"按钮的时候,显示10组随机数中每组的最大数程序(用VB 或者C 或者 JAVA)
JVM设计的线程要共享这些变量资源就必须先读入自己的线程内存中才能使用,我们称之为local memory那么线程1和线程2同时访问变量T,其中线程1改变了T的值,线程2并不知道,这样就出现了脏数据。JVM为了保持访问同步,数据一致而设计的同步关键字其意义就是楼主看到的那句话:“当线程为释放相关监视器而退出一个同步块时,JMM 要求本地处理器缓冲刷新到主存中”, 刷新内存的本质就是将 线程的 local memory中的变量值赋值到 global memory中,而在线程1退出同步块之前,线程2是不能访问变量值的(同步的语意),当线程1退出同步块之后线程2再访问就一定是最新的变量值不存在脏数据了volatile可以从另外一个角度上实现这种同步,就是凡是被volatile修饰的变量在每次读取时候JVM强制要求必须去 global memory中比较一次,这样不用加锁同步也可以解决脏数据问题不知道这样解释楼主明白了没,呵呵!