深入理解java虚拟机

    xiaoxiao2021-03-25  8

    1、高速缓存:

    由于计算机的存储设备与处理器的运算速度有几个数量级的差距, 所以现代计算机系统都不得不加入一个读写速度尽可能接近处理器运算速度的高速缓存来作为内存与处理器之间的缓存: 将运算需要使用到的数据复制到缓存中, 让运算能快速进行, 当运算结束后再从缓存同步回内存中.

    2、指令重排序:

    为了使得处理器内部的运算单元能尽量被充分利用, 处理器可能会对输入代码进行乱序执行优化, 处理器会在计算之后将乱序执行的结果重组, 保证该结果与顺序执行的结果是一致的, 但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致,

    3、主内存与工作内存:

    1、每条线程都有一个自己的工作内存, 线程对变量的操作必须在自己的工作内存中进行, 不能直接对主内存中的变量进行读写; 2、不同的线程之间无法直接访问对方工作内存中的变量, 线程间变量值的传递均需要通过主内存来完成. 3、工作内存对应于虚拟机栈中的部分区域;

    4、volatile:

    当一个变量被volatile修饰以后, 他具备两种特性:

    1、保证此变量对所有线程的可见性 2、禁止指令重排序优化

    1、由于volatile变量只能保证可见性, 在不符合以下两条规则的运算场景中, 我们仍然要通过枷锁来保证原子性.

    1、运算结果并不依赖当前值, 或者能够确保只有单一线程修改变量的值; 2、变量不需要与其他的状态变量共同参与不变的约束;

    2、普通的变量仅仅会保证在该方法的执行过程中所有依赖赋值结果的地方都能获得正确的值, 而不能保证变量赋值操作的顺序与程序代码中的执行顺序一致.

    5、原子性、可见性与有序性:

    Java内存模型是围绕着在并发过程中如何处理原子性、可见性和有序性这3个特征来建立的. 1、原子性:

    1、基本数据类型的访问读写是具备原子性的; 2、synchnorized块之间的操作也具备原子性;

    2、可见性:

    1、可见性是指当一个线程修改了共享变量的值, 其他线程能够立即得知这个修改; 2、volatile的特殊规则保证了新值能立即同步到主内存, 以及每次使用前立即从主内存刷新;

    3、有序性:

    1、Java内存模型的有序性在前面讲解volatile时也详细地讨论过了, Java程序中天然的有序性可以总结为一句话: 如果在本线程内观察, 所有的操作都是有序的; 如果一个线程中观察另一个线程, 所有的操作都是无序的. 前半句是指”线程内表现为串行的语义”, 后半句是指”指令重排序”现象和”工作内存与主内存同步延迟”现象; 2、Java语言提供了volatile和synchronized两个关键字来保证线程之间操作的有序性, volatile关键字本身就包含了禁止指令重排序的语义, 而synchronized则是由”一个变量在同一时刻只允许一条线程对其进行lock操作”这条规则获得的, 这条规则决定了持有同一个锁的两个同步块只能串行地进入;

    转载请注明原文地址: https://ju.6miu.com/read-200341.html

    最新回复(0)