Java中的synchronized和volatile
Java  /  管理员 发布于 4年前   260
说到Java的线程同步问题肯定要说到两个关键字synchronized和volatile。说到这两个关键字,又要说道JVM的内存模型。JVM里内存分为main memory和working memory。
Main memory是所有线程共享的,working memory则是线程的工作内存,它保存有部分main memory变量的拷贝,对这些变量的更新直接发生在working memory里,并在适当的时候写回main memory。这样如果有多个线程访问同一个变量,就会发生同步问题。
synchronized是常用的同步手段,它可以用来同步程序块,甚至整个函数。但有时候synchronized显得太过粗放。提高多线程程序性能的一个要点就是尽量把同步的粒度最小化,最好做到share nothing, no synchronization。
volatile就是一种粒度更小的同步手段。当然volatile关键字的原始语义并不是用来做同步的。volatile的字面意思是“易变的”,用这个关键字修饰变量就是要告诉JVM,这个变量会被多个线程访问,不要把它放到working memory里,而只有main memory一个拷贝,所有对它的操作都在main memory里进行。由于在32位机器上,对基本类型int, char等的存取操作都在一个指令内完成,也就是说是原子的,这就给线程之间同步共享数据提供了一种力度更小,效率更高的手段。但对long,double等基本类型,由于对它们的操作需要多条指令,不是原子的,所以就不是线程安全的。
这和C/C++中的volatile语义是差不多的,C/C++中的寄存器就是这里的working memory,内存就是main memory。可以说在Java1.4之前,Java和C/C++里volatile的语义基本一致。
但Java1.5里,volatile的语义被扩充完善,自动扩展了对double,float等基本类型为原子操作。
123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..路人 在
php中使用hyperf框架调用讯飞星火大模型实现国内版chatgpt功能示例中评论 教程很详细,如果加个前端chatgpt对话页面就完美了..Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号