这篇文章主要讲解了“Javavolatile关键字的特性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Javavolatile关键字的特性是什么”吧!volatile是Java中的关键字,用来修饰会被不同线程访问和修改的变量。volatile是Java虚拟机提供的轻量级的同步机制,它有三个特性:(1)保证可见性(2)不保证原子性(3)免费云主机域名禁止指令重排volatile保证可见性Java内存模型(JMM)定义了一组规则、规范,规定了程序中各个变量的访问方法。JMM关于同步的规定:(1)线程解锁前,必须把共享变量的值刷新回主内存;(2)线程加锁前,必须读取主内存的最新值同步到自己的工作内存;(3)加锁解锁必须是同一把锁;说明:由于JVM运行程序的实体是线程,创建每个线程时,JMM会为其创建一个工作内存(也称栈空间),工作内存是每个线程的私有数据区域。Java内存模型规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问。但是线程对变量的操作(读取、赋值等)必须在工作内存中进行。因此首先要将变量从主内存拷贝到自己的工作内存,然后对变量进行操作,操作完成后再将变量写会主内存中。举例说明:(1)火车票卖票系统还剩下一张票,并已经刷入到主内存中:ticketNum = 1;(2)此时有3个用户在同时购买票,3个线程都读入了目前的票数,ticketNum=1,那么线程就会继续进入购买流程。(3)假设其中一个线程先抢占了CPU资源,先买到票,并将自己的工作内存中的ticketNum值改为0,ticketNum=0,然后再写回到主内存。这时,由于一个线程的用户已经买到了票,那么其他用户的线程应该不能再继续进入购买票的流程了,因此需要系统通知到其他线程 ticketNum=0 这个消息。如果可以达到这样的效果,可以理解为 具有可见性。无可见性代码演示:执行结果:
线程[Thread-0] 正在执行
线程[Thread-0]更新后,number值为:10结果分析:可以看出子线程启动后将number值改为了10,虽然已经改为了非0,但是主线程仍然一直处于while循环中,因此此时number不具有可见性,系统不会主动通知主线程number值修改。原理说明:这个问题其实就是私有堆栈中的值和公共堆栈中的值不同步造成的。解决这样的问题就要使用 volatile 关键字了,它主要的作用就是当线程访问number这个变量时,强制性从公共堆栈中进行取值。可见性代码演示:执行结果:
线程[Thread-0] 正在执行
线程[Thread-0]更新后,number值为:10
具有可见性验证通过结果分析:通过对变量number变量添加了volatile关键字修饰,可以看出子线程启动后将number值改为了10,随后主线程跳出了while循环,输出了“具有可见性验证通过”,说明此时number具有可见性。原理说明:通过使用 volatile 关键字,强制从公共内存中读取变量的值,内存结构如图:感谢各位的阅读,以上就是“Javavolatile关键字的特性是什么”的内容了,经过本文的学习后,相信大家对Javavolatile关键字的特性是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!
这篇文章主要讲解了“如何使用nodejs生成二维码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用nodejs生成二维码”吧!生成二维码:constqrCode=require(‘qrcode’) cla…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。