- 多线程概述
1.1. 多线程编程存在的问题与风险
- 线程安全(Thread safe)问题.
多线程共享数据时,如果没有采取正确的并发访问控制措施,就可能会产生数据一致性问题,如读取脏数 据(过期的数据), 如丢失数据更新. - 线程活性(thread liveness)问题.
由于程序自身的缺陷或者由资 源稀缺性导致线程一直处于非 RUNNABLE 状态,这就是线程活性问题, 常见的活性故障有以下几种:
(1) 死锁(Deadlock). 类似鹬蚌相争.
(2) 锁死(Lockout), 类似于睡美人故事中王子挂了
(3) 活锁(Livelock). 类似于小猫咬自己尾巴
(4) 饥饿(Starvation).类似于健壮的雏鸟总是从母鸟嘴中抢到食物. - 上下文切换(Context Switch).
处理器从执行一个线程切换到执 行另外一个线程
4)可靠性.
可能会由一个线程导致 JVM 意外终止,其他的线程也 无法执行.
-
线程安全问题
非线程安全主要是指多个线程对同一个对象的实例变量进行操作 时,会出现值被更改,值不同步的情况.
线程安全问题表现为三个方面: 原子性,可见性和有序性 。
2.1. 原子性
含义:操作不可分割、操作顺序不变
2.2. 可见性
概念:其他线程能否立即读到共享变量的更新
2.3. 有序性
几个概念:
源代码顺序:源码中指定的内存访问顺序.
程序顺序:处理器上运行的目标代码所指定的内存访问顺序
执行顺序:内存访问操作在处理器上的实际执行顺序
感知顺序:给定处理器所感知到的该处理器及其他处理器的内存访问操作的顺序
重排序:对内存访问有序操作的一种优化,可以在不影响单线程 程序正确的情况下提升程序的性能.但是,可能对多线程



