Day117 并发编程基础
并发编程基础
在 Java Web 开发、Jdbc 开发、Web 服务器、分布式框架时会遇到线程安全问题,这一块比较难,涉及到很多抽吸概念的理解,需要用到JVM,操作系统,计算机组成原理等知识。
概述
-
基本概念:
- 程序:程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。
- 进程:进程就是用来加载指令、管理内存、管理 IO 的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。比如在Windows系统中,一个运行的xx.exe就是一个进程。
- 线程: 一个进程之内可以分为一到多个线程,一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行,Java 中,线程作为最小调度单位,进程作为资源分配的最小单位。
- 并发(concurrent)是同一时间应对(dealing with)多件事情的能力。多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行。
- 并行(parallel)是同一时间动手做(doing)多件事情的能力。单位时间内,多个处理器或多核处理器同时处理多个任务,是真正意义上的“同时进行”。
- 单核 cpu 下,线程实际还是 串行执行 的。操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感觉是 同时运行的 。总结为一句话就是: 微观串行,宏观并行 ,
并发编程的优缺点
-
优点:
- 通过并发编程的形式可以将多核CPU的计算能力发挥到极致(?)
- 方便进行业务拆分,提升系统并发能力和性能:现在的系统动不动就要求百万级甚至千万级的并发量,而多线程并发编程正是开发高并发系统的基础。
-
缺点: 并发编程可能会遇到很多问题,比如:内存泄漏、上下文切换、线程安全、死锁等问题。
-
并发编程三要素:
- 原子性:原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。
- 可见性:一个线程对共享变量的修改,另一个线程能够立刻看到。(synchronized,volatile)
- 有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)
-
出现线程安全问题的原因:
- 线程切换带来的原子性问题
- 缓存导致的可见性问题
- 编译优化带来的有序性问题
-
解决办法:
- JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题
- synchronized、volatile、LOCK,可以解决可见性问题
- Happens-Before 规则可以解决有序性问题
https://www.bilibili.com/video/BV16J411h7Rd?p=6