Java并发三大问题之可见性

 

JMM中的L1和L2缓存虽然较好地缓解了CPU与内存之间巨大的读取速度差异带来的cpu使用率过低问题,但是同时却不可避免的带来了其它方面问题,比如可见性问题,⼀个线程对共享变量的修改,另外⼀个线程能够⽴刻看到,我们称为可⻅性。譬如主内存中有一个静态变量 x=0,线程A通过复制将x=0先复制到L2再复制到L1进行加一计算,此时线程B也进行同样操作,将x=0先后拷贝到L2和L1,后加一计算,正常情况下我们预期得到的结果是x=2,但是有些情况下却不然,线程A执行加一操作以后还没来得及将x=1回写到主内存和L2中线程B就从L2读取x=0,这样一下来最终得到的结果是x=1,要解决这种可见性问题就要用到关键字volatile;

当读⼀个 volatile 变量时, JMM 会把该线程对应的本地内存置为⽆效。线程接下来将从主内存中读取共享变量。

 

posted @ 2023-02-11 15:28  HexThinking  阅读(15)  评论(0编辑  收藏  举报