240 发简信
IP属地:四川
  • 120
    深入理解JVM-内存模型(jmm)和GC

    1 CPU和内存的交互 了解jvm内存模型前,了解下cpu和计算机内存的交互情况。【因为Java虚拟机内存模型定义的访问操作与计算机十分相似】 有篇很棒的文章,从cpu讲到内...

  • 原子性,对volatile变量的读写具有原子性,即单纯读和写的操作,都不会受到干扰。这里有误
    public class VolatileTest {
    private static volatile int INIT_VALUE = 0;

    private final static int MAX_LIMIT = 500;

    public static void main(String[] args) {
    new Thread(() -> {
    while (INIT_VALUE < MAX_LIMIT) {
    System.out.println("T1->" + (++INIT_VALUE));
    try {
    Thread.sleep(10);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }, "ADDER-1").start();

    new Thread(() -> {
    while (INIT_VALUE < MAX_LIMIT) {
    System.out.println("T2->" + (++INIT_VALUE));
    try {
    Thread.sleep(10);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }, "ADDER-2").start();
    }
    }

    部分打印结果:
    T1->19
    T2->20
    T1->21
    T1->22
    T2->23
    T1->24
    T2->25
    T1->26
    T2->26
    T1->27
    T2->27
    T2->28
    T1->28
    T1->29
    T2->30
    T1->32

    ++INIT_VALUE 操作分三步:
    a.读取变量 INIT_VALUE的值 -> 26
    INIT_VALUE 的值+1 -> 26+1
    将值赋予变量 INIT_VALUE -> INIT_VALUE=27
    由于这三步中的任意一步线程都可能放弃cpu执行权,其他线程获取到执行权后如果一步完成,就会出现上图的情况

    深入理解JVM-内存模型(jmm)和GC

    1 CPU和内存的交互 了解jvm内存模型前,了解下cpu和计算机内存的交互情况。【因为Java虚拟机内存模型定义的访问操作与计算机十分相似】 有篇很棒的文章,从cpu讲到内...