前言
在职场论坛看到这样一个帖子,程序员小A被前公司裁员了,裁员之后也并没有特别气馁,打算重头再来,结果却被现实打击到了。
他大学毕业的时候进入到一家知名互联网公司上班,工作期间,也是不断学习,提升自己的能力,但是在自己37岁的时候,还是被公司裁员了。
他开始把简历投递到大型互联网公司,结果都因为年纪比较大给拒绝了,找了四个月工作,一直这样也不是办法,为了家人孩子,开始妥协,向小型互联网公司投递简历,万万没有想到的是,HR竟然嫌弃自己的工作能力,当他听到这句话的时候,估计都气的都冒气了!
对于数据不一致问题,不同的操作系统有不同的系统级指令的解决方案,来约束线程的数据在何时从主内存读取,何时写入主内存。
1.2、JAVA内存模型解决的问题
市面上的操作系统百花齐放,而Java作为一个跨平台的语言,势必要为用户屏蔽底层细节。因此在操作系统内存模型的基础上,对共性抽象提出了Java 内存模型。
Java内存模型
JMM规定:
1、主内存:也就是虚拟机内存(可以类比理解为物理硬件的内存条),所有共享变量均在主内存存储
2、工作内存:JMM 的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器等。每个线程均有自己的工作内存,其中存储的是线程工作所需的主内存数据的拷贝副本。
3、线程无法获取其它线程的工作内存的数据,因此线程通信的方式有两种,其一是共享内存传递数据,其二是消息通信。
Java内存模型,也即在Java虚拟机中实现的内存模型,约束了将变量存储到内存和从内存中取出变量这样的底层细节。具体分为以下三个层面
原子性
指的是一组指令在cpu执行过程中,cpu不会被中断,也即这一组指令要么不执行,要么执行且全部完成。
有序性
在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序,可能会打乱代码执行顺序。
A、指令重排需要满足两个条件
在不改变单线程程序语义的前提下
存在数据依赖关系的不允许重排序
B、重排序分三种类型
编译期的重排序。从java源码到编译成class文件,可以重新安排语句的执行顺序。
CPU指令级并行的重排序。处理器可以改变语句对应机器指令的执行顺序,多条指令可以并行执行。即时编译器JIT也会做指令重排
内存系统的重排序。线程工作内存与主内存同步延迟,这使得加载和存储操作看上去可能是在乱序执行。
从 java 源代码到最终实际执行的指令序列,会分别经历下面三种重排序:
C、禁止重排序的手段——内存屏障(memory barrier)
内存屏障是一个CPU指令,能达到两个效果:
确保一些特定操作执行的顺序,禁止指令重排序
影响数据可见性,写屏障会将线程工作内存的数据强制写入主内存,读屏障会强制从工作内存读取数据
可见性
指的是多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
1、保证可见性的手段——happens-before原则
如果 A happens-before B,那么 Java 内存模型则保证: A 操作的结果将对 B 可见,且 A 的执行顺序排在 B 之前
-
程序顺序规则:一个线程中的每个操作,happens- before 于该线程中的任意后续操作。
-
监视器锁规则:对一个监视器锁的解锁,happens- before 于随后对这个监视器锁的加锁。
-
volatile 变量规则:对一个 volatile 域的写,happens- before 于任意后续对这个 volatile 域的读。
-
传递性:如果 A happens- before B,且 B happens- before C,那么 A happens- before C。
2、 JAVA虚拟机模型(JVM)
=================
jvm规定的虚拟机内存分配模型
JDK8按照JVM规范的具体实现
程序计数器
程序计数器是描述CPU运行的存储结构。CPU自带的存储介质是寄存器,CPU运行计算所需的任何数据都需要从寄存器获取。每个线程在创建后,都会产生自己的程序计数器和栈帧。
由于CPU的时间片轮转特性,一个线程承载的任务可能在一个CPU时间片内无法完成,此时操作系统会会随机选择下一个线程执行,因此需要程序计数器存放执行指令的偏移量和行号指示器等,线程执行或恢复都要依赖程序计数器。
生命周期:和线程同生共死,线程创建时诞生,线程结束时消亡
虚拟机栈
虚拟机栈是描述方法执行的存储结构,用后进先出的栈结构,按照方法执行顺序记录方法地址。每个线程的虚拟机栈的栈顶指示的就是所有活动方法列表。
生命周期:和线程同生共死,线程创建时诞生,线程结束时消亡
本地方法栈
结尾
最后,针对上面谈的内容,给大家推荐一个Android资料,应该对大家有用。
首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)
接下来是资料清单:(敲黑板!!!)
1.数据结构和算法
2.设计模式
3.全套体系化高级架构视频;七大主流技术模块,视频+源码+笔记
4.面试专题资料包(怎么能少了一份全面的面试题总结呢~)
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
9754044940)]
4.面试专题资料包(怎么能少了一份全面的面试题总结呢~)
[外链图片转存中…(img-dhw6kIHb-1649754044940)]
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
[外链图片转存中…(img-QF6diKC0-1649754044941)]
Android开发不会这些?如何面试拿高薪!