JavaEE______多线程3

线程安全问题

  • 一. 线程安全问题
    • 1)抢占式执行(狼多肉少--CPU少线程多)
    • 2)多个线程同时修改了同一个变量
    • 3)操作是非原子性操作
    • 4)内存可见性问题**
    • 5)指令重排序
  • 二. volatile 解决内存可见性问题和指令重排序问题
    • 2. volatile 缺点
  • 三. 锁(synchronized 和 lock)!!!
    • 3.1 内置锁synchronized
      • 3.1.1 基本使用:
      • 3.1.2 synchronized 特性
        • a. 互斥
        • b.刷新内存
        • c. 可重入
      • 3.1.3 synchronized 底层实现和运行原理
    • 3.2 可重入锁 Lock(ReentrantLock)

一. 线程安全问题

概念: 程序在多线程的执行环境下,线程的执行结果不符合预期
线程不安全因素

1)抢占式执行(狼多肉少–CPU少线程多)

2)多个线程同时修改了同一个变量

3)操作是非原子性操作

例·:temp-- 是非原子性操作

  1. 查询temp当前值
  2. temp-1 操作
  3. 刷新temp最新值

4)内存可见性问题**

Java内存模型(JMM) :Java虚拟机规范中定义了Java内存模型
目的是屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果。

JavaEE______多线程3_第1张图片
a. 线程之间的共享变量存在 主内存 (Main Memory)
b. 每一个线程都有自己的“工作内存”(Working Memory)
c. 当线程要读取一个共享变量的时候,会先把变量从主内存拷贝到工作内存,再从工作内存读取数据
d. 当线程要修改一个共享变量的时候,也会先修改工作内存中的副本,再同步回主内存
由于每个线程有自己的工作内存,这些工作内存中的内容相当于一个共享变量的“副本”,此时修改线程1的工作内存中的值,线程2的工作内存不一定会及时变化

import java.time.LocalDateTime;

public class ThreadDemo14 {
   
    private static boolean flag = true;

    public static void main(String[] args) {
   

        //创建子线程1
        Thread t1 = new Thread(()->{
   
            System.out.println("线程1开始执行" + LocalDateTime.now

你可能感兴趣的:(JavaEE,java-ee)