java内存模型和java内存结构(java的内存模型和内存结构)

java内存模型和java内存结构(java的内存模型和内存结构)p style margin bottom 0px letter spacing 0 578px text wrap wrap text align left br p

大家好,我是讯享网,很高兴认识大家。




讯享网

 <p style="margin-bottom: 0px; letter-spacing: 0.578px; text-wrap: wrap; text-align: left;"><br/></p><p style="margin-bottom: 0px; letter-spacing: 0.578px; text-wrap: wrap; text-align: left;"><strong style="letter-spacing: 0.578px;">大家好,我是mikechen</strong><br/></p><p style="margin-bottom: 0px;letter-spacing: 0.578px;text-wrap: wrap;"><span style="font-size: 16px;"><strong><br/></strong></span></p><p style="margin-bottom: 0px;letter-spacing: 0.578px;text-wrap: wrap;"><span style="letter-spacing: 0.578px;text-wrap: wrap;">Java内存模型经常在Java面试被问到,比如:Java内存模型作用与实现等,下面重点详解Java内存模型@</span>mikechen</p><p style="margin-bottom: 0px;letter-spacing: 0.578px;text-wrap: wrap;"><br/></p><p></p><div><span style="font-size: var(--articleFontsize);letter-spacing: 0.034em;"></span></div><p></p><p>Java内存模型,全称Java Memory Model,简称JMM,是Java程序运行时内存的抽象概念,描述了Java程序如何在内存中存储和访问数据。</p><p>Java内存模型定义了一些规则和原则,比如:规定了线程如何与内存进行交互,包括线程之间的同步和数据共享,作用就是:确保程序的正确性和一致性。</p><p>&nbsp;</p><p>Java内存模型中主要包括以下内容:</p><p>Java内存模型中的主内存(Main Memory)是所有线程共享的内存区域,用于存储Java程序中的变量和对象实例等数据。</p><p>如下图黄色部分所示:</p><p><img src="http://img.blog.itpub.net/blog/2024/01/26/dc0ec8f6f7.jpeg?x-oss-process=style/bb"/></p><p>所有的变量都存储在主内存中,包括静态变量、实例变量和数组元素等。</p><p>主内存可以被所有线程访问,但线程不能直接访问主内存中的变量。</p><p>只能通过将主内存中的变量读取到自己的工作内存中,或将自己工作内存中的变量写回主内存中,来实现对主内存的访问。</p><p><strong>在Java内存模型中,主内存具有以下特点:</strong></p><p>因为主内存中的数据可以被多个线程同时访问,因此需要使用同步机制来保证多个线程对同一数据的访问顺序和正确性。</p><p>Java中提供了Synchronized、Volatile、ReentrantLock等同步机制来保证多线程程序的正确性和一致性。</p><p>Java内存模型中每个线程都有自己的工作内存(Working Memory),也称为本地内存(Local Memory),用于存储线程执行时需要使用的变量和对象实例等数据。</p><p>每个线程的工作内存都是独立的,只能通过读取和写入自己的工作内存来间接访问主内存。</p><p>如下图所示:</p><p><img src="http://img.blog.itpub.net/blog/2024/01/26/bea60d805d2b6a42.jpeg?x-oss-process=style/bb"/></p><p><strong>在Java内存模型中,工作内存具有以下特点:</strong></p><p>&nbsp;</p><p>Java内存模型中,内存交互操作是指线程间进行数据通信的操作,包括读操作、写操作和锁定操作等。</p><p>如下图绿色部分,所示:</p><p><img src="http://img.blog.itpub.net/blog/2024/01/26/d6880e6d5036ac56.jpeg?x-oss-process=style/bb"/></p><p>内存交互操作可以保证线程间对变量的操作顺序和正确性,保证多线程程序的正确性和一致性。</p><p>Java内存模型定义了以下内存交互操作,主要分为以下8种:</p><p><strong>1.lock(锁定)</strong></p><p>lock作用于主内存的变量,它把一个变量标识为一条线程独占的状态。</p><p><strong>2.unlock(解锁)</strong></p><p>unlock作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。</p><p><strong>3.read(读取)</strong></p><p>read作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。</p><p><strong>4.load(载入)</strong></p><p>load作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。</p><p><strong>5.use(使用)</strong></p><p>use作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作。</p><p><strong>6.assign(赋值)</strong></p><p>assign作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。</p><p><strong>7.store(存储)</strong></p><p>store作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随后的write操作使用。</p><p><strong>8.write(写入)</strong></p><p>write作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中。</p><p>&nbsp;</p><p>Java内存模型中的Happens-Before规则是指在多线程环境下,为了保证程序正确性,程序中的操作需要满足一定的顺序关系,即Happens-Before关系。</p><p>Happens-Before规则包括以下几种:</p><p>Happens-Before规则是Java内存模型中非常重要的概念,它能够保证多线程程序的正确性和一致性。</p><p>&nbsp;</p><p>Java内存模型中的原子性、可见性和有序性是指多线程环境下,程序中的操作需要满足一定的特性,以保证程序的正确性和一致性。</p><p><strong>1.原子性(Atomicity)</strong></p><p>原子性指的是一个操作或者多个操作要么全部执行成功,要么全部执行失败,不会出现中间状态。在Java中,原子性操作可以通过synchronized关键字、Lock对象、Atomic包中的原子类等方式来实现。</p><p><strong>2.可见性(Visibility)</strong></p><p>可见性指的是一个线程对共享变量的修改,能够被其他线程立即看到,不会出现数据不一致的情况。在Java中,可见性可以通过volatile关键字、synchronized关键字等方式来实现。</p><p><strong>3.有序性(Ordering)</strong></p><p>有序性指的是程序中的操作在执行时按照一定的顺序执行,不会出现随机性和乱序执行的情况。在Java中,有序性可以通过synchronized关键字、volatile关键字等方式来实现。</p><p>在编写多线程程序时,需要同时考虑这三个特性,以保证程序的正确性和一致性。</p><p>以上就是Java内存模型的详解,更多Java多线程内存,请查看:Java多线程编程详解(看这篇就足够了)</p><p><br/></p><p style="display: none;"></p> 

讯享网
小讯
上一篇 2025-06-15 14:16
下一篇 2025-06-13 21:00

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/155292.html