持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情
多线程编程的优势与存在的风险
问题与风险:
线程安全(Thread safe)问题.多线程共享数据时,如果没有采取 正确的并发访问控制措施,就可能会产生数据一致性问题,如读取脏数 据(过期的数据), 如丢失数据更新.
线程活性(thread liveness)问题.由于程序自身的缺陷或者由资 源稀缺性导致线程一直处于非 RUNNABLE 状态,这就是线程活性问题,
常见的活性故障有以下几种:
- 死锁(Deadlock). 类似鹬蚌相争.
- 锁死(Lockout), 类似于睡美人故事中王子挂了
- 活锁(Livelock). 类似于小猫咬自己尾巴
- 饥饿(Starvation).类似于健壮的雏鸟总是从母鸟嘴中抢到食物.
上下文切换(Context Switch). 处理器从执行一个线程切换到执 行另外一个线程
可靠性. 可能会由一个线程导致 JVM 意外终止,其他的线程也 无法执行
1、 线程安全问题。多个线程共享数据的时候,如果没有采取相应的并发访问措施,那么就会产生数据一致性的问题,如读取脏数据(过期的数据)、丢失更新(更新被覆盖)等。
2、 线程的生命特征问题。代码编写不适当可能导致某些线程一直处于等待其他线程释放锁的状态,即产生了死锁。例如:线程T1拥有锁L1,并试图去获得锁L2,而此时线程T2用户拥有锁L2而试图是获得锁L1,这就导致线程T1和T2一直处于等待对方释放锁而一直又得不到的状态。等等。
3、 上下文切换。多线程编程的必然副产物,增加了系统的消耗,不利于系统的吞吐率。
4、 可靠性。一方面有利于可靠性,例如:某个线程意外终止了,但这并不影响其他线程继续其处理。另一方面,线程是进程的一个组件,它总是存在于特定的进程中的,如果这个进程由于某种原因意外提前终止了,比如某个java进程由于内存泄漏导致JVM崩溃,那么该进程中的所有线程也就随之而无法继续运行。