第七章 JVM对高效并发的支持

一. Java内存模型与内存间的交互操作

1. Java内存模型

1.1 概念

1.2 示意图

1.3 规则

2. 内存交互

2.1 操作名词



2.2 操作流程

2.3 操作的规则



二. volatile(❤❤❤)

1. 多线程可见性

2. volatile

2.1 不安全演示

java 复制代码
package src.com.yh.jvm.parallel;

/**
 * 演示volatile多线程下不安全
 */
public class A {
    //计数
    private volatile int count;

    public int getCount() {
        return count;
    }

    /**
     * 加一操作
     */
    public void addOne() {
        count++;
    }
}
java 复制代码
package src.com.yh.jvm.parallel;

/**
 * 线程,对A的count进行累加操作
 */
public class MyThread implements Runnable {
    private A a = null;
    private String name = "";

    public MyThread(A a, String name) {
        this.a = a;
        this.name = name;
    }

    /**
     * 线程:对对象A的count累计操作
     */
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            a.addOne();
        }
        System.out.println("thread_name:" + name + " is game over--->");
    }
}
java 复制代码
package src.com.yh.jvm.parallel;

public class Test1 {
    public static void main(String[] args) throws Exception {
        A a = new A();
        Thread t1 = new Thread(new MyThread(a, "t1"));
        Thread t2 = new Thread(new MyThread(a, "t2"));

        t1.start();
        t2.start();

        t1.join();
        t2.join();


        System.out.println("方法变量A.count=" + a.getCount());
    }
}

业务上,两个线程对方法变量A的count属性进行累加操作,如果线程安全那么待两线程结束运行后该值应该为2000
下面为多次执行结果图



可见,最后结果不为2000,并且每次执行结果不可预估

如果给加一方法添加synchronized 锁

java 复制代码
package src.com.yh.jvm.parallel;

/**
 * 演示volatile多线程下不安全
 */
public class A {
    //计数
    private volatile int count;

    public int getCount() {
        return count;
    }

    /**
     * 加一操作
     */
    public synchronized void addOne() {
        count++;
    }
}

3. volatile使用场景

三. 指令重排原理和规则

1. 指令重排原理


2. 指令重排规则



五. 线程安全处理

六. 锁优化

相关推荐
小江的记录本9 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
小江的记录本11 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
小江的记录本11 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:G1:Region分区、Mixed GC、回收流程、适用场景(高频)(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·spring cloud·面试
ID_1800790547315 小时前
小红书评论 API 接口详解与实战开发
java·jvm·c++
東雪木17 小时前
JVM 与 Java 内存模型 专属复习笔记
java·jvm·笔记·java面试
Undergoer_TW20 小时前
Colmap 进军嵌入式:SQLite 数据库从崩溃退出到自动治愈
jvm·数据库·sqlite
骄马之死21 小时前
ThreadLocal 核心原理
java·jvm·算法
一只小白00021 小时前
【JVM | 第二篇】—— 类加载器 & 双亲委派模型
jvm
Nyarlathotep011321 小时前
自动内存管理(3):HotSpot中垃圾收集的实现
jvm·后端
仍然.1 天前
浅谈JVM
jvm