我的世界服务器网站怎么做,网站监测,哪里可以做网页,互联网营销有哪些方式java内存模型概述在计算中#xff0c; 内存模型描述了线程如何通过内存交互#xff0c;或更一般地#xff0c;它指定了为分段内存或分页内存平台生成代码时允许编译器进行的假设。 在给定程序和该程序的执行跟踪的情况下#xff0c;它实质上描述了执行跟踪是否是该程序的合… java内存模型概述 在计算中 内存模型描述了线程如何通过内存交互或更一般地它指定了为分段内存或分页内存平台生成代码时允许编译器进行的假设。 在给定程序和该程序的执行跟踪的情况下它实质上描述了执行跟踪是否是该程序的合法执行。 Java内存模型描述了Java编程语言中的线程如何通过内存进行交互。 连同代码的单线程执行的描述一起内存模型提供了Java编程语言的语义。 最初的Java内存模型开发于1995年人们普遍认为它已损坏从而阻止了许多运行时优化并且没有为代码安全性提供足够有力的保证。 它通过Java社区流程进行了更新即Java规范请求133JSR-133 该规范于2004年对TigerJava 5.0生效。 您可以在Java语言规范的“ 线程和锁 ”一章以及此Java内存模型讨论页面中找到一些非常有用的信息。 现在让我们来看看我们最新的JCG合作伙伴 Manoj在“ The Khangaonkar Report ”中提供的一些见解。 注意对原始帖子进行了少量编辑以提高可读性 Java内存模型描述了定义多个线程写入和读取变量时如何看待写入内存的规则。 当线程读取变量时不一定从内存中获取最新值。 处理器可能返回一个缓存的值。 此外即使程序员在编写代码时先写入变量然后读取变量但只要编译器不改变程序语义就可以对其重新排序。 处理器和编译器这样做通常是为了优化性能。 结果线程可能看不到它期望看到的值。 这可能导致难以修复并发程序中的错误。 Java编程语言提供了“ synchronized”“ volatile”和“ final”关键字来帮助编写安全的多线程代码。 但是由于内存模型未指定Java的早期版本存在一些问题。 JSR 133Java内存模型和线程规范修订版修复了早期内存模型中的某些缺陷。 大多数程序员都熟悉这样一个事实即进入同步块意味着在监视器上获得锁定以确保没有其他线程可以进入同步块。 不那么熟悉但同样重要的事实是 1获取锁并输入同步块会强制线程从内存刷新数据。 2退出同步块后写入的数据将刷新到内存中。 这确保了同步块中的线程所写的值对于同步块中的其他线程可见。 有没有听说过Java上下文中的“ 发生在……之前 ” JSR 133引入了“之前发生”一词并为程序中动作的顺序提供了一些保证。 这些保证是 1线程中的每个动作都在该线程之后的所有其他动作之前发生。 2显示器上的解锁发生在同一显示器上的后续锁定之前 3对变量的易失性写入发生在对同一变量的后续易失性读取之前 4对Thread.start的调用发生在该线程中的任何其他语句之前 5线程中的所有动作在该线程上的其他任何线程从join返回之前发生 术语“动作”在Java语言规范的17.4.2节中定义为可以被其他线程检测或影响的语句。 正常的读/写易失性的读/写锁定/解锁是一些动作。 规则1、4和5保证在单个线程中所有动作将按照它们在创作程序中出现的顺序执行。 规则2和4确保在处理共享数据的多个线程之间保持同步块的相对顺序以及对易失变量的读/写顺序。 规则2和4使volatile非常类似于同步块。 在JSR 133之前volatile仍然意味着对volatile变量的写操作直接写到内存中而读操作则从内存中读取。 但是编译器可能会对非易失性读/写进行重新排序而非易失性读/写会导致错误的结果。 在JSR 133之后无法使用。 还有一点值得注意。 这与在类的构造函数中初始化的最终成员有关。 只要构造函数正确完成执行其他线程就可以看到最终成员而无需同步。 但是如果您从构造函数中共享对对象的引用则所有选择都将关闭。 提出的规范描述了线程锁易失性变量和数据竞争的语义。 这包括所谓的Java内存模型 。 相关文章 Cajo用Java完成分布式计算的最简单方法 Java最佳实践–高性能序列化 Java最佳实践–字符串性能和精确字符串匹配 Java最佳实践– Vector vs ArrayList vs HashSet Java最佳实践–队列之战和链接的ConcurrentHashMap 翻译自: https://www.javacodegeeks.com/2011/02/java-memory-model-quick-overview-and.htmljava内存模型概述