java虚拟机内存模型?
Java虚拟机相当于一个抽象的计算机操作系统,其管理的内存区域大体上可以分为栈和堆,就像c或c中对内存的分类一样,但这样的分类对于Java虚拟机来说太过粗浅,实际上Java虚拟机管理的内存区域分为程序计数器、虚拟机栈、本地方法栈、堆和方法区,根据各区域是属于线程私有还是由线程共享,这些区域可以分为两类,下面分别进行说明 。
Java内存模型的核心问题就是如何解决一致性问题?
【codedot,内存模型】java内存模型其实是跟计算机硬件发展息息相关的,CPU的运算能力相比较于硬盘,内存的存取能力是相当高的,就好比我(CPU)分明能一分钟从1加到100,你(内存)却只能给到我1到10,内存的存取大大的限制了CPU的运算,所以就在内存和CPU中间加了高速缓存,用于CPU的快速计算,如下图:JAVA内存模型也采用了相似的结构,线程与CPU交互的时候,为了快速的进行运算,线程本地会开辟一份内存用于数据存储,然后快速的与CPU进行交互,CPU的运算数据也通过线程推送到内存中,如下图:现在问题来了,从CPU到主内存需要经过线程的本地内存,在多线程的环境下,如果CPU运算数据不能及时的推到主内存中,就引发了线程安全问题,比如java中的经典案例i=0;i;这么一个简单地语句,如果线程1将i变为1之后还没来得及写到主内存中,线程2也是用i=0这个数据去运算,那么原本i两次之后应该得到2,现在却只能输出1;由此可见java内存模型是模拟计算机硬件设计的,主要的作用其实还是用来提升整个系统的运算能力,但却由此产生了多线程的线程安全问题,线程安全的主要问题是原子性,可见性,有序性问题; 怎么解决线程安全的问题呢? 1,资源不共享:比如TheadLocal,数据直接放在线程的本地内存中,每个线程有一份自己的数据,不存在安全问题2,资源共享但是加锁:比如synchronize,reentrantLock等,将共享资源进行加锁,只有在保证线程处理完成或者中断的时候,才会让别的线程继续处理这份数据; 3,资源共享但是无锁:比如AtomicBoolean,AtomicInteger等主要是使用CAS保证数据的原子性操作,使用volatile保证数据的可见性来保证数据安全; 本文提到的东西比较浅显易懂,更多深入的,精彩的java方面的技术分享正在路上,需要的朋友敬请关注 。
推荐阅读
- 小米12双卡还是单卡,小米mlx尊享版6g内存256g内存是双卡还是单卡
- iphone se内存大小 iphone se内存
- iphone3g运行内存,iphone3g能后台运行QQ加UC吗他开机的纯净剩余运行内存是多少
- 4g内存是多大 4g内存
- iphone11运行内存,苹果11系统运行内存满了怎么清理
- 6230i,6230i和6230i小内存有什么不同
- 模型制作的参考文献有哪些,八个模型帮助打造度量模型
- iphone se第三代内存,iPhone se的运行内存是多大的
- 安卓手机内存卡格式,手机内存卡是FAT32格式还是EXFAT格式
- 忘了手机锁屏密码怎么办,手机的解锁密码忘记了怎么办在不清除数据内存的情况下有什么简单