Java内存模型-有人能解释一下吗?

2023-12-12

多年来,我一直试图理解part处理内存模型和并发性的 Java 规范。我不得不承认我失败得很惨。是的,我了解锁、“同步”、wait() 和 notification()。我可以很好地使用它们,谢谢。我什至对“不稳定”的作用有一个模糊的概念。但所有这些都不是源自语言规范,而是源自一般经验。

这是我要问的两个示例问题。我对特定答案不太感兴趣,因为我需要了解如何从规范中得出答案(或者可能是我如何得出规范没有答案的结论)。

  • “挥发性”到底有什么作用?
  • 写入变量是原子的吗?它取决于变量的类型吗?

我不会尝试在这里实际回答您的问题 - 相反,我会将您重定向到我看到推荐的关于该主题的建议的书:Java 并发实践.

警告一句:如果有are答案在这里,预计其中不少是错误的。我不打算发布详细信息的原因之一是因为我很确定I'd至少在某些方面是错误的。当我说每个认为自己可以回答这个问题的人实际上有足够严格的能力来正确回答的机会几乎为零时,我的意思并不是对社区的任何不尊重。 (Joe Duffy 最近发现了一些令人惊讶的 .NET 内存模型。如果他能弄错,那么像我们这样的凡人也能弄错。)


我仅就一个方面提供一些见解,因为它经常被误解:

波动性和原子性之间存在差异。人们通常认为原子写入是易失性的(即,如果写入是原子的,则无需担心内存模型)。这不是真的。

波动性是指执行读取的一个线程(逻辑上,在源代码中)是否会“看到”另一个线程所做的更改。

原子性是指如果发生变化是否有可能is看到,只有部分变化会被看到。

例如,以写入整数字段为例。这保证是原子的,但不是易失性的。这意味着如果我们有(从 foo.x = 0 开始):

Thread 1: foo.x = 257;
Thread 2: int y = foo.x;

这是可能的y为 0 或 257。由于原子性约束,它不会是任何其他值(例如 256 或 1)。但是,即使您知道在“挂断时间”中,线程 2 中的代码在线程 1 中的代码之后执行,也可能存在奇怪的缓存、内存访问“移动”等。x挥发性将解决这个问题。

我会把剩下的事情留给真正诚实的专家。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java内存模型-有人能解释一下吗? 的相关文章

随机推荐

  • 为什么 DateTime.ToString("dd/MM/yyyy") 给我 dd-MM-yyyy ?

    我希望将我的日期时间转换为格式为 dd MM yyyy 的字符串 每当我使用它进行转换时DateTime ToString dd MM yyyy I get dd MM yyyy反而 我必须设置某种文化信息吗 斜杠是日期分隔符 因此将使用当
  • 如何找出 .net 类实现了哪些接口?

    好的 我最近一直在学习 c 和 net c 文档中似乎缺少一件事http msdn microsoft com java 文档中存在 例如数组列表文档 是一个java类的文档会这样说 所有实现的接口 可序列化 可克隆 可迭代 集合 列表 随
  • 如何禁用 grails 中的 log4j 插件?

    看来Grails 2 1 log4j 插件在 grails 应用程序初始化期间重置 log4j 配置 请参阅下面的堆栈跟踪 at org apache log4j LogManager resetConfiguration LogManag
  • 使用 Spark 从 Scala 中的 Dataframe 中的数组列中删除 null (1.6)

    我有一个带有 id 列的数据框和一个具有结构数组的列 架构 root id string nullable true desc array nullable false element struct containsNull true na
  • 提交 HTML 表单后,如何使用 FastAPI 将用户重定向回主页?

    我有一个包含学生表格的页面 我添加了一个按钮 允许您向表中添加新行 为此 我将用户重定向到带有输入表单的页面 问题是 提交完成的表单后 用户会转到一个新的空白页面 如何传输已完成表单中的数据并将用户重定向回表格 我刚刚开始学习Web编程 所
  • Eclipse 插件 - 如何获取编辑器的最后工作

    我正在编写一个 Eclipse 插件 它通过几个按钮向用户公开一个视图 单击任何按钮时 我想将特定注释粘贴到用户当前正在工作的编辑器窗口中以及他指向的光标位置 一旦用户单击该按钮 编辑器窗口就不再具有焦点 并且以下代码不起作用 workbe
  • 来自参数的 Azure 数据工厂源数据集值

    我在 Azure Datafactory 中有一个由 CSV 文件支持的数据集 我在数据集中添加了一个附加列 并希望从数据集参数传递它的值 但值永远不会复制到该列 type AzureBlob structure name MyField
  • 在 where 子句中使用局部变量的替代方法

    我有一个查询 其中有一个使用多个局部变量构建的 where 子句 但这非常慢 以下是一个粗略的示例 因为我当前无权访问该查询 declare a varchar 50 b varchar 50 c varchar 50 set a set
  • 如何配置 ESLint 以允许粗箭头类方法

    ESLint 正在抛出一个Parsing error Unexpected token 当我尝试 lint 我的 Es6 类时出错 我缺少什么配置参数来启用 eslint 中的胖箭头类方法 示例类 class App extends Rea
  • 在 Haskell 中如何轮询文件、套接字或句柄以使其可读/可写?

    我如何从 Haskell 观看多个文件 套接字并等待它们变得可读 可写 Haskell 中有类似 select epoll 的东西吗 或者我被迫为每个文件 套接字生成一个线程 并始终使用该线程内的阻塞资源 这个问题是错误的 你不是force
  • 如何从字符串中去除特定标签和特定属性?

    事情是这样的 我正在做一个项目来帮助人们教授 HTML 我自然是害怕史蒂夫那个渣男 见图1 所以我想阻止ALLHTML 标签 except那些在非常具体的情况下批准的白名单 在那些已批准的 HTML 标签中 我想删除有害的属性以及 例如on
  • 为什么 Spring MVC 报告“找不到类型的返回值的转换器:class org.json.JSONObject”?

    我想返回一个由两个字符串组成的 JSON 但不知道如何实现它 这是我的代码 PostMapping public ResponseEntity lt gt createUser RequestBody User user JSONObjec
  • 避免返回所有实体的学说

    使用Symfony2 doctrine2 当我们使用find 函数根据选择的实体获取特定对象 如果存在关系 时 如OneToMany Doctrine返回所有其他对象 例如 em this gt get doctrine orm entit
  • IOS 自动布局更改旋转位置

    我想将一个容器发送到另一个容器的下方 纵向发送 横向发送并排 仅使用自动布局可以吗 我知道我可以通过编程来做到这一点 只是想知道是否可以从布局中做到这一点 像这样 Well didRotateFromInterfaceOrientation
  • 如果 popstate 事件来自 HTML5 Pushstate 的后退或前进操作,如何检索?

    我正在开发一个网页 根据下一个或后一个操作我执行相应的动画 使用推送状态时会出现问题 当我收到事件时 我如何知道用户是否使用 Pushstate API 单击后退或前进历史记录按钮 或者我是否必须自己实现某些内容 您必须自己实现它 这很容易
  • C# WriteFile(),无法写入USB HID设备

    我对 C 和 Windows 编程相当陌生 我正在尝试在 USB HID 设备之间建立通信 我使用 SetupDiGetDevicexxxxxx 成功获取设备路径 并使用 CreateFile 获取句柄 下面是我的代码 public con
  • 使用map()时出现意外的逗号

    我有一个包含元素列表的数组 我尝试使用模板字符串将此列表附加到 HTML 元素 var description HTML CSS Javascript object oriented programming Progressive Web
  • 如何用Spark高效读取多个小parquet文件?有CombineParquetInputFormat吗?

    Spark 生成了多个小 parquet 文件 如何在生产者和消费者 Spark 作业上有效处理少量 parquet 文件 恕我直言 最直接的方法是在写入 parquet 文件之前使用重新分区 合并 除非数据倾斜并且您想要创建相同大小的输出
  • std::vector 的对齐问题

    我终于遇到了这里描述的烦人的问题 https eigen tuxfamily org dox group TopicStlContainers html 我有一个包含多个特征固定大小矩阵的结构 并且我想将结构的多个实例存储在 std vec
  • Java内存模型-有人能解释一下吗?

    多年来 我一直试图理解part处理内存模型和并发性的 Java 规范 我不得不承认我失败得很惨 是的 我了解锁 同步 wait 和 notification 我可以很好地使用它们 谢谢 我什至对 不稳定 的作用有一个模糊的概念 但所有这些都