Day117 并发编程基础

并发编程基础

在 Java Web 开发、Jdbc 开发、Web 服务器、分布式框架时会遇到线程安全问题,这一块比较难,涉及到很多抽吸概念的理解,需要用到JVM,操作系统,计算机组成原理等知识。

概述

  • 基本概念
    • 程序:程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。
    • 进程:进程就是用来加载指令、管理内存、管理 IO 的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。比如在Windows系统中,一个运行的xx.exe就是一个进程。
    • 线程: 一个进程之内可以分为一到多个线程,一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行,Java 中,线程作为最小调度单位,进程作为资源分配的最小单位。
    • 并发(concurrent)是同一时间应对(dealing with)多件事情的能力。多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行。
    • 并行(parallel)是同一时间动手做(doing)多件事情的能力。单位时间内,多个处理器或多核处理器同时处理多个任务,是真正意义上的“同时进行”。
    • 单核 cpu 下,线程实际还是 串行执行 的。操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感觉是 同时运行的 。总结为一句话就是: 微观串行,宏观并行 ,

Day117 并发编程基础

并发编程的优缺点

  • 优点

    • 通过并发编程的形式可以将多核CPU的计算能力发挥到极致(?)
    • 方便进行业务拆分,提升系统并发能力和性能:现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础。
  • 缺点: 并发编程可能会遇到很多问题,比如:内存泄漏、上下文切换、线程安全、死锁等问题

  • 并发编程三要素

    • 原子性:原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。
    • 可见性:一个线程对共享变量的修改,另一个线程能够立刻看到。(synchronized,volatile)
    • 有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)
  • 出现线程安全问题的原因

    • 线程切换带来的原子性问题
    • 缓存导致的可见性问题
    • 编译优化带来的有序性问题
  • 解决办法

    • JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题
    • synchronized、volatile、LOCK,可以解决可见性问题
    • Happens-Before 规则可以解决有序性问题

https://www.bilibili.com/video/BV16J411h7Rd?p=6