Java的多线程代码最终被映射到操作系统线程上执行。
操作系统线程不是线程安全的吗?
为什么要使用Java内存模型来确保线程安全?为什么要定义Java内存模型?
我希望有人能回答这个问题,我在网上查了很多资料,还是不明白!
web上的材料都是关于原子性、可见性、有序性的,并以缓存一致性模型为例,但我认为它并没有真正回答这个问题。
非常感谢!
发布于 2020-05-27 14:53:57
操作系统线程不是线程安全的(该语句没有多大意义,但基本上,操作系统不能确保代码的预期原子性得到尊重)。
问题是,两个数据项是否相关,因此是否需要同步,只有您的应用程序才能真正理解。
例如,假设您正在定义一个ListOfIntegers类,其中包含一个整数数组和该数组中使用的项数的计数。这两个数据项是相关的,它们的更新方式需要协调,以便确保如果对象被两个不同的线程访问,即使线程同时更新它们,它们也总是以一致的方式更新。只有您的应用程序知道这些数据项是如何相关的。操作系统不知道。就它而言,它们只是两个内存。这就是为什么你必须实现线程安全(通过使用同步或仔细安排字段的更新方式)。
Java的“内存模型”非常接近于硬件模型。有一个用于原语和对象的堆栈,对象被分配到堆上。提供同步以允许程序员锁定对堆上共享数据的访问。此外,优化器必须遵循一些规则,以便优化操作不会破坏同步。
发布于 2020-05-27 16:35:52
每种认真对待并发性的编程语言都需要一个内存模型--这就是为什么。
内存模型是共享内存系统并发语义的核心。它为并发程序执行的任何给定的写操作定义了允许读操作返回的可能值,从而定义了共享变量的基本语义。换句话说,内存模型指定了程序的读写操作的一组允许的输出,并约束实现只产生(但至少一次)这样的允许执行。存储器模型可以并且经常允许执行其中不能从程序中发生读和写操作的顺序推断出结果的执行。如果没有明确的内存模型,就不可能对程序或编程语言实现的任何部分进行有意义的推理。内存模型定义了并发程序读写操作的可能结果。相反,存储器模型还定义处理器、存储器系统或编译器可以允许哪些指令重新排序。
这是我与人合著的论文Memory Models for C/C++ Programmers的摘录。尽管其中很大一部分是专门介绍C++内存模型的,但它也涵盖了更一般的领域-从我们首先需要内存模型的原因开始,解释(直观的)顺序一致模型,最后是x86和ARM/POWER CPU中当前硬件提供的较弱的内存模型。
发布于 2020-05-27 21:43:10
Java内存模型回答了以下问题:当多个线程修改相同的内存位置时会发生什么情况。
内存模型给出的答案是:如果一个程序没有数据竞争,那么该程序的所有执行看起来都是顺序一致的。
有一篇很棒的论文,作者是Sarita V. Adve,Hans-J。Memory Models: A Case For Rethinking Parallel Languages and Hardware谈为什么Java和C++内存模型是这样设计的
摘自论文:
我们一再惊讶于将看似简单而基本的属性“在多线程程序中读取应该返回什么值”这一看似简单的基本属性形式化是多么困难。
描述共享变量语义的内存模型对于正确的多线程应用程序和整个底层实现堆栈都至关重要。在不清楚内存模型的情况下,很难教授多线程编程。
在经历了许多之前的混乱之后,主要的编程语言正在汇聚到一个模型上,该模型保证了“无数据竞争”程序的简单的基于交错的语义,并且大多数硬件供应商已经承诺支持这个模型。
https://stackoverflow.com/questions/62036945
复制相似问题