volatile 可见性

淩亂°似流年 2021-11-05 12:58 491阅读 0赞

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

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

程序:

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTY2Nzcy_size_16_color_FFFFFF_t_70

程序一直不结束。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTY2Nzcy_size_16_color_FFFFFF_t_70 1

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

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

第一次

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

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

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTY2Nzcy_size_16_color_FFFFFF_t_70 2

程序结束

20190807082257515.png

发表评论

表情:
评论列表 (有 0 条评论,491人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Volatile可见

    Volatile 使变量在多个线程可见 每一个线程都会有一块工作内存区 其中,存放着所有线程共享的主内存中的变量值的拷贝 当线程执行时 在自己的工作区内存中