"当线程为释放相关监视器而退出一个同步块时,JMM 要求本地处理器缓冲刷新到主存中。(实际上,内存模型不涉及缓存——它涉及一个抽象( 本地内存), 它包围了缓存、注册表和其他硬件和编译优化。)与此类似,作为获得监视的一部分,当进入一个同步块时,本地缓存失效,使之后的读操作直接进入主内存而不是本地缓存。这一过程保证当变量是由一个线程在由给定监视器保护的同步块中写入,并由另一个线程在由同一监视器保护的同步块中读取时,对变量的写可被读线程看到。如果没有同步,则 JMM 不提供这种保证——这就是为什么在多个线程访问同一个变量时,必须使用同步(或者它的更年轻的同胞 volatile )。"我不是特别明白这是什么意思?

解决方案 »

  1.   

    呵呵,鄙人不才,给楼主解释一下这段话吧!首先要明确一个概念,线程之间共享的资源是内存中的数据,说白了这数据就是对象(以及对象中的变量),这些变量存储在global memory中
    JVM设计的线程要共享这些变量资源就必须先读入自己的线程内存中才能使用,我们称之为local memory那么线程1和线程2同时访问变量T,其中线程1改变了T的值,线程2并不知道,这样就出现了脏数据。JVM为了保持访问同步,数据一致而设计的同步关键字其意义就是楼主看到的那句话:“当线程为释放相关监视器而退出一个同步块时,JMM 要求本地处理器缓冲刷新到主存中”,  刷新内存的本质就是将 线程的 local memory中的变量值赋值到 global memory中,而在线程1退出同步块之前,线程2是不能访问变量值的(同步的语意),当线程1退出同步块之后线程2再访问就一定是最新的变量值不存在脏数据了volatile可以从另外一个角度上实现这种同步,就是凡是被volatile修饰的变量在每次读取时候JVM强制要求必须去 global memory中比较一次,这样不用加锁同步也可以解决脏数据问题不知道这样解释楼主明白了没,呵呵!