volatile 关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见。
                          相较于 synchronized 是一种较为轻量级的同步策略。

volatile修饰的变量在被一个线程修改后,会被强制立即刷新到主存(可见性),其他线程如果有该变量的缓存行,会被设置为无效。

程序:

ThreadDemo线程更改flag为true,在main线程中循环,直到flag为true,打印--------,然后结束循环。

 volatile 可见性

 程序一直不结束。

 volatile 可见性

 原因:JVM会为两个线程分配两个私有缓存区域,两个线程都会从主存内(共享内存)拿到flag,在各自的私有内存里面对变量进行操作,然后刷新到主存。

因为ThreadDemo休眠200毫秒,main线程先执行,然后ThreadDemo再执行。

第一次

if (threadDemo.isFlag())  判断为false

第二次按理说可以结束循环,但是while循环指令优先级高,导致每次在私有内存中拿到数据,每次拿到的还是原来的数据。

我们可以通过给变量加上volatile关键字,让main线程强制每次去主存中拿变量,解决问题。

volatile 可见性

 程序结束

volatile 可见性

相关文章:

  • 2020-04-18
  • 2021-07-14
  • 2022-12-23
  • 2021-08-14
  • 2021-04-09
  • 2021-10-29
  • 2021-04-30
  • 2021-09-05
猜你喜欢
  • 2021-07-27
  • 2021-08-13
  • 2021-08-31
  • 2021-10-01
  • 2021-09-07
  • 2020-04-12
相关资源
相似解决方案