volatile的疑问

《并发编程的艺术》中对volatile读的语义这么描述:
P41:线程从主内存中读取共享变量;
是指线程直接操作主内存?
还是说JMM可以先把主内存的值刷新到本地内存,然后线程再从本地内存中读取?
全部评论
线程都是对工作内存进行操作的。对于主内存和工作内存之间值的传递,volatile有特定的规则,所以让人感觉是直接从主内存中直接取值。
点赞 回复 分享
发布于 2017-08-28 17:52
刷新到本地操作
点赞 回复 分享
发布于 2017-08-28 17:48
刷新到工作内存吧。。没听说过线程可以直接操作主内存的
点赞 回复 分享
发布于 2017-08-28 17:49
这本书拉入黑名单
点赞 回复 分享
发布于 2017-08-28 19:16
读的时候会先把自己线程的本地内存设为无效,再从主线程读取值至本地线程,再从本地线程中读取值,线程通过本地内存与进程内存交互。vo内存语义其实就是在重排序中插入了内存屏障保证读写顺序。
点赞 回复 分享
发布于 2017-08-29 12:10

相关推荐

09-27 20:04
东北大学 Java
2024/09/27 度小满二面1.介绍实习所做的项目,你在项目中负责什么,你在项目中是什么角色,你实现了什么功能,遇到了什么问题是怎么解决的拷打项目9.乐观锁是提交时读取版本还是获取时读取版本10.如果提交失败11.事务的回滚是如何实现的12.回滚前的版本存在哪里13.微服务和分布式系统之间的区别是什么14.springboot和spring之间的区别是什么15.springboot中的starter是什么16.如果从服务提供方的角度写一个starter应该注意什么17.int a = 1; int b = 2; return a+b;如果这段代码运行起来会经历什么步骤,越详细越好从jvm说到java文件编译18.jvm内存分布19.多个jvm之间相互调用应该怎么实现20.redis在开发中的作用是什么你用过什么样的redis部署架构21.redis使用分布式锁应该注意什么问题22.如果手写一个红锁应该怎么实现23.项目中为什么使用线程池24.使用线程池的应该注意什么25.为什么要针对io密集型操作和cpu密集型操作设计不同线程池,他们各自的特点是什么算法:使用非递归的方式实现二叉树的中序遍历这完全和一面不是一个难度了,问题问的好发散,问的都是应该注意什么,不问纯八股,需要对所背的八股有思考,问了好多实现,还是要真实写过这些的,估计是凉了,好难,不过还是期待一手三面吧。许愿三面
点赞 评论 收藏
分享
Git的工作流程通常包括以下几个步骤:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&uuid=f818c6d22c98401682f8662612b9e57f克隆(Clone):首先,通过克隆一个远程仓库到本地,创建一个本地仓库的副本。这样可以在本地进行开发和修改。添加和修改(Add and Modify):在本地仓库中进行代码的添加和修改。开发者可以通过添加新文件、修改现有文件或删除文件来进行开发工作。暂存(Stage):将修改的文件添加到暂存区(也称为索引),准备提交到版本库。暂存区相当于一个缓冲区,用于存放即将提交的修改。提交(Commit):将暂存区的修改提交到版本库。每次提交都会生成一个唯一的提交记录,包含了修改的详细信息,如作者、时间戳和提交消息。推送(Push):将本地的提交推送到远程仓库,与团队成员共享代码。推送操作将本地的提交同步到远程仓库,使得其他人可以看到和使用这些修改。拉取(Pull):从远程仓库拉取最新的代码更新到本地仓库。当其他人推送了新的修改到远程仓库时,开发者可以通过拉取操作获取这些更新。合并(Merge):将不同分支的修改合并到一起。当开发者在不同的分支上进行并行开发时,可以使用合并操作将分支的修改合并到主分支或其他分支上。冲突解决(Conflict Resolution):当多个分支对同一文件进行了不同的修改时,可能会发生冲突。开发者需要手动解决这些冲突,选择保留哪些修改或进行修改的合并。这些步骤构成了Git的基本工作流程。通过这个工作流程,开发者可以有效地管理代码的版本、协作开发和跟踪修改历史。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务