实例讲解 java valotie 变量可见性

  • 原创
  • |
  • 浏览:175
  • |
  • 更新:

Java中,valotie关键字也是一个很常见的关键字,valotie关键字通常在多线程环境中使用,下面我们来学习下valotie 变量的可见性。

工具/原料

  • windows10
  • windows10
  • Intellij idea2018
  • jdk1.8

方法/步骤

  1. 1

    valotie修饰变量时,对这个变量的修改会立即通知到其他线程,这就是变量的可见性。定义一个布尔型的变量stop和计数器count,在main函数主线程中创建一个子线程,子线程run方法中,当stop为false时,count就不停的加1。启动子线程后,主线程睡眠1秒,然后将stop设置为true。如下图:

    实例讲解 java valotie 变量可见性
  2. 1
    此文章未经授权抓取自百度经验
  3. 2

    按照期望,主线程睡眠1秒将stop变量设置为true后,子线程就应该停止对计数器的加1了。实际运行上,子线程并没有停止,而是陷入死循环,说明主线程将stop变量设置为true后,stop变量值的改变并没有通知到子线程。如下图输出的运行结果中,并没有打印“child thread stop,stop=”这句。

    实例讲解 java valotie 变量可见性
  4. 3

    将stop变量用valotie修饰后,主线程将stop变量设置为true后,子线程立即停止对计数器的操作,说明子线程已经获知了stop变量修改后的值,并打印“child thread stop,stop=true”这句。如下图:

    实例讲解 java valotie 变量可见性
  5. 4

    由于每个线程的都有自己的工作内存,当主线程修改stop(共享变量)后,并不会马上将stop(共享变量)刷新到主存中,子线程获取到的stop(共享变量)的值依然是旧的。当给stop(共享变量)加上valotie修饰后,主线程对stop的修改会立即刷新到主存中,并通知子线程工作内存中的stop值无效,子线程就重新从主存中读取stop的值。

    END

注意事项

  • 1.System.out打印语句会强制同步内存数据,所以在上文例子中的while循环中不能使用,否则看不到变量可见性的效果。
  • 2.jdk8之后jvm对valotie做了调整,可见性可能在jdk8之前版本效果不一样。
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
展开阅读全部