为什么要定义Java内存模型?

为什么要定义Java内存模型?,java,multithreading,jvm,memory-model,java-memory-model,Java,Multithreading,Jvm,Memory Model,Java Memory Model,Java的多线程代码最终映射到操作系统线程以执行 操作系统线程不是线程安全的吗 为什么要使用Java内存模型来确保线程安全?为什么要定义Java内存模型 我希望有人能回答这个问题,我在网上查了很多资料,还是不明白 web上的内容都是关于原子性、可见性、有序性,并以缓存一致性模型为例,但我认为它并不能真正回答这个问题 多谢各位 操作系统线程不是线程安全的,这句话没有多大意义,但基本上,操作系统无法确保您的代码的预期原子性得到尊重 问题在于,只有应用程序才能真正理解两个数据项是否相关,因此是否需要同

Java的多线程代码最终映射到操作系统线程以执行

操作系统线程不是线程安全的吗

为什么要使用Java内存模型来确保线程安全?为什么要定义Java内存模型

我希望有人能回答这个问题,我在网上查了很多资料,还是不明白

web上的内容都是关于原子性、可见性、有序性,并以缓存一致性模型为例,但我认为它并不能真正回答这个问题


多谢各位

操作系统线程不是线程安全的,这句话没有多大意义,但基本上,操作系统无法确保您的代码的预期原子性得到尊重

问题在于,只有应用程序才能真正理解两个数据项是否相关,因此是否需要同步

例如,假设您正在定义一个ListofIntegraters类,该类包含一个int数组和数组中使用的项数计数。这两个数据项是相关的,需要协调它们的更新方式,以确保如果对象由两个不同的线程访问,它们总是以一致的方式更新,即使线程同时更新它们。只有您的应用程序知道这些数据项是如何关联的。操作系统不知道。就它而言,它们只是两块记忆。这就是为什么必须通过使用同步或仔细安排字段的更新方式来实现线程安全


Java内存模型与硬件模型非常接近。基本体有一个堆栈,对象在堆上分配。提供同步以允许程序员锁定对堆上共享数据的访问。此外,优化器必须遵循一些规则,以便意见不破坏已设置的同步。

操作系统线程不是线程安全的,该语句没有太多意义,但基本上,操作系统无法确保遵守代码的预期原子性

问题在于,只有应用程序才能真正理解两个数据项是否相关,因此是否需要同步

例如,假设您正在定义一个ListofIntegraters类,该类包含一个int数组和数组中使用的项数计数。这两个数据项是相关的,需要协调它们的更新方式,以确保如果对象由两个不同的线程访问,它们总是以一致的方式更新,即使线程同时更新它们。只有您的应用程序知道这些数据项是如何关联的。操作系统不知道。就它而言,它们只是两块记忆。这就是为什么必须通过使用同步或仔细安排字段的更新方式来实现线程安全


Java内存模型与硬件模型非常接近。基本体有一个堆栈,对象在堆上分配。提供同步以允许程序员锁定对堆上共享数据的访问。此外,优化器还必须遵循一些规则,以使观点不会破坏已实施的同步。

每一种重视并发性的编程语言都需要一个内存模型,原因如下

内存模型是共享内存系统并发语义的关键。它定义了允许读操作为并发程序执行的任何给定写操作集返回的可能值,从而定义了共享变量的基本语义。换句话说,内存模型指定了程序读写操作的一组允许输出,并限制实现只产生但至少产生一个这样的允许执行。内存模型可能并且经常允许执行无法从程序中读写操作的顺序推断结果的执行。如果没有明确的内存模型,就不可能对程序或编程语言实现的任何部分进行有意义的推理。内存模型定义了并发程序读写操作的可能结果。相反,内存模型还定义了处理器、内存系统或编译器可能允许的指令重新排序

这是我合著的那篇论文的摘录。虽然它的大部分都是C++内存模型,但它也涵盖了更多的领域。 首先从我们需要内存模型的原因开始,解释直观的顺序一致性模型,最后是x86和ARM/POWE中当前硬件提供的较弱的内存模型
R CPU。

每一种重视并发性的编程语言都需要一个内存模型——这就是为什么

内存模型是共享内存系统并发语义的关键。它定义了允许读操作为并发程序执行的任何给定写操作集返回的可能值,从而定义了共享变量的基本语义。换句话说,内存模型指定了程序读写操作的一组允许输出,并限制实现只产生但至少产生一个这样的允许执行。内存模型可能并且经常允许执行无法从程序中读写操作的顺序推断结果的执行。如果没有明确的内存模型,就不可能对程序或编程语言实现的任何部分进行有意义的推理。内存模型定义了并发程序读写操作的可能结果。相反,内存模型还定义了处理器、内存系统或编译器可能允许的指令重新排序

这是我合著的那篇论文的摘录。虽然它的大部分都是C++内存模型,但它也涵盖了更多的领域。
从我们首先需要记忆模型的原因开始,解释直观的顺序一致模型,最后是x86和ARM/POWER CPU中当前硬件提供的较弱的内存模型。

Java内存模型回答了以下问题:当多个线程修改同一内存位置时会发生什么

记忆模型给出的答案是: 如果一个程序没有数据竞争,那么该程序的所有执行看起来都是顺序一致的

Sarita V. Adve、HANS.J.Boem有一篇关于java和C++内存模型为什么设计的方式:< /P> 从报纸上看:

我们一再感到惊讶的是,将“在多线程程序中读取应该返回什么值”这一看似简单且基本的属性形式化是多么困难

描述共享变量语义的内存模型对于正确的多线程应用程序和整个底层实现堆栈都至关重要。如果不清楚内存模型,就很难教授多线程编程

在经历了很多之前的混乱之后,主要编程语言正在汇聚到一个模型上,该模型保证了无数据竞争程序的简单的基于交织的语义,并且大多数硬件供应商已经承诺支持该模型


Java内存模型回答了以下问题:当多个线程修改同一个内存位置时会发生什么

记忆模型给出的答案是: 如果一个程序没有数据竞争,那么该程序的所有执行看起来都是顺序一致的

Sarita V. Adve、HANS.J.Boem有一篇关于java和C++内存模型为什么设计的方式:< /P> 从报纸上看:

我们一再感到惊讶的是,将“在多线程程序中读取应该返回什么值”这一看似简单且基本的属性形式化是多么困难

描述共享变量语义的内存模型对于正确的多线程应用程序和整个底层实现堆栈都至关重要。如果不清楚内存模型,就很难教授多线程编程

在经历了很多之前的混乱之后,主要编程语言正在汇聚到一个模型上,该模型保证了无数据竞争程序的简单的基于交织的语义,并且大多数硬件供应商已经承诺支持该模型


线程安全不是线程的属性。它是处理线程间共享数据的代码属性。线程安全性不是线程的属性。它是处理线程间共享数据的代码属性。所以它不仅仅是Java,任何支持并发的编程语言都应该有内存模型?是的。内存模型就是语言如何使用硬件内存。如果它想成为多线程的,它需要考虑如果一次有多个内核访问内存,那么内存访问将如何进行。谢谢你的回答,因为在使用python开发多线程程序时,我没有遇到内存模型的概念,只有Java有,我讨厌理解是的。。。而在某些语言中缺乏正式的内存模型是许多编程和可移植性问题的根本原因!所以不仅仅是Java,任何支持并发的编程语言都应该有一个内存模型?是的。内存模型就是语言如何使用硬件内存。如果它想成为多线程的,就需要考虑
如果一次有多个内核访问内存,则emory访问将正常进行。感谢您的回答,因为在使用python开发多线程程序时,我没有遇到内存模型的概念,只有Java有,我讨厌理解是的。。。而在某些语言中缺乏正式的内存模型是许多编程和可移植性问题的根本原因!