1、上下文切换

CPU通过给每个线程分配CPU时间片来实现这个机制;
CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换任务前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存再到加载的过程就是一次上下文切换。

如何减少上下文切换?

无锁并发编程
CAS算法
使用最少线程
协程

实战:

JPS查看线程ID
Jstack pid查看线程情况
jmap -dump :format=b,file=heaDump [pid] 生成堆转储文件

2、死锁

什么是死锁?

死锁是指两个或两个以上进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞现象,若无外力作用下,他们都将无法推进下去。此时系统处于死锁状态或者系统产生了死锁,这些永远在互相等待的进程成为死锁进程。

死锁产生的原因?

1、系统资源的竞争
2、进程运行推进顺序不当引起死锁

产生死锁的四个必要条件

互斥条件

指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用,如果此时还有其他进程请求资源,则请求者只能等待,直至占有资源的进程释放完毕。

请求与保持条件

进程已经保持了至少一个资源,但是又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

不可剥夺条件

进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)

循环等待条件

指在死锁发生时,必然存在一个进程——资源的环形链,即进程集合 {P0,P1,P2,…,Pn}中P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,…,Pn正在等待P0占用的资源。

避免死锁的几个常用办法

打破互斥条件:改造独占性资源为虚拟资源,大部分资源已无法改造。
打破不可抢占条件:当一进程占有一独占性资源后又申请一独占性资源而无法满足则退原占有的资源。
打破占有且申请条件:采用资源预先分配策略,即进程运行前申请全部资源,满足则运行,不然就等待,这样就不会占有且申请。
打破循环等待条件:实现资源有序分配策略,对所有设备实现分类编号,所有进程只能才能按序号递增的形式申请资源。
注:避免一个线程同时获取多个锁;避免一个线程在锁内同时占用多个资源,尽量保持每个锁只占用一个资源;
尝试使用定时锁,使用lock.tryLock(timeout)来代替使用内部锁机制;
对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。