Java开发那些事从零开始学JavaJava学习笔记

Java虚拟机总结给面试的你(下)

2018-02-09  本文已影响23人  浪浪的麦子

本篇博客主要针对Java虚拟机的晚期编译优化,Java内存模型与线程,线程安全与锁优化进行总结,其余部分总结请点击Java虚拟总结上篇Java虚拟机总结中篇

一.晚期运行期优化

即时编译器JIT

即时编译器JIT的作用就是热点代码转换为平台相关的机器码,并进行优化,它并不是一个虚拟机所必须的部分,只能说有它是锦上添花。

热点代码

热点代码分类

热点探测判定方法

编译过程(Client Complier)

优化方法

公共子表达式优化

当一个表达式A的结果已经计算过了,且A中的所有变量都没有发生过变化,那么下一次要用到A时就不用计算了,而是直接取之前A的结果。

数组边界检查消除

方法内联

逃逸分析

逃逸的定义:一个在方法里定义的变量,作为参数传递给其他方法(方法逃逸),或者赋值给类变量(线程逃逸)。

优化方法:

二.Java内存模型与线程

内存模型

说了这么多的内存模型,到底什么是内存模型呢?

特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。

它的作用是定义程序中各个共享的变量的访问规则,即如何将变量写入内存和从内存中取出变量。Java内存模型有主内存与工作内存之分,所有变量存在主内存中,线程则是拥有自己的工作内存,它是主内存的副本拷贝,线程只能读写工作内存。

8种原子操作

  1. lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态。
  2. unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
  3. read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的 load 动作使用。
  4. load(载入):作用于工作内存的变量,它把 read 操作从主内存中得到的变量值放入工作内存的变量副本中。
  5. use(使用):作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎,每当虚拟机遇到一个需要使用到变量的值的字节码指令时将会执行这个操作。
  6. assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。
  7. store(存储):作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便随后的 write 操作使用。
  8. write(写入):作用于主内存的变量,它把 store 操作从工作内存中得到的变量的值放入主内存的变量中。

volatile变量的特殊规则

volatile的特性是保证此变量对所有线程的可见性,即当变量的值修改后,其他线程可以立即知道发生的变化。普通变量则是修改完值后,需要写回主内存,然后其他线程再从主内存读取该数据。volatile还可以通过内存屏障来禁止指令的重排序。综合来讲它的读操作和普通变量差不多,写操作慢一点。

long和double变量的特殊规则

8种操作一般都是原子性的,但是对于64位的数据,内存模型允许将没有被volatile修饰的64位数据的读写操作划分为两次32位的操作进行---->非原子协定但一般我们不需要将long和double声明为volatile。

先行发生原则

Java与线程

Java的Thread类大多API都是Native方法,是与平台相关的。

实现线程的三种方式

线程的调度

线程的状态

三.线程安全与锁优化

线程安全的程度,依次减弱

线程安全的实现方法

  1. 互斥同步

    synchronized关键字会在代码块的前后分别形成monitorenter和monitorexit指令,这两个指令需要一个reference对象参数,该锁有一个计数器以实现同步,进入时将计数器+1,退出时-1,本线程可重入,其他线程需阻塞等待。synchronized的缺点是由于Java线程是映射到操作系统的,所以唤醒阻塞一个线程都需要系统帮忙,需要从用户态转到内核态,耗费很多处理器时间。

    ReentrantLock对synchronized的优势:

    • 等待可中断
    • 公平锁:必须按照申请锁的时间顺序来一次获得锁
    • 锁绑定多个条件
  2. 非阻塞同步

    为了解决线程阻塞和唤醒所带来的性能问题,先对共享数据进行操作,如果没有竞争就成功了,否则就补偿(不断重试直到成功)

  3. 无同步方案

    • 可重入代码
    • 线程本地存储,把共享数据的范围限制到线程内,ThreadLocalMap以ThreadLocalHashMap为键,以本地线程变量为值的K-V对

锁优化

锁优化的方案有以下几种:

上一篇 下一篇

猜你喜欢

热点阅读