1、什么是线程上线文切换
时间片是CPU分配给线程执行的时间,由于时间片非常短,所以CPU通过不停切换线程执行。时间片时长一般几十毫秒。
在切换线程前会保存当前任务线程的状态,以便下次再切回这个任务时可以再加载这个任务 的状态。任务从保存到再次加载的过程是一次上线文切换。
2、死锁
线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。
public class DeadLock {
private final Object left = new Object();
private final Object right = new Object();
public static void main(String[] args) {
int n = 10;
DeadLock deadLock = new DeadLock();
for (int i = 0; i < n; i++) {
deadLock.deadLock();
}
}
public void deadLock() {
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
synchronized (left) {
System.out.println("hello left,i need right,so ...");
synchronized (right) {
System.out.println("hello right,i am come in.");
}
}
}
});
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
synchronized (right) {
System.out.println("hello right,i need left,so ...");
synchronized (left) {
System.out.println("hello left,i am come in.");
}
}
}
});
threadA.start();
threadB.start();
}
}
避免死锁的方法:
- 避免一个线程同时获取多个锁;
- 避免一个线程在锁内同时占用多个资源,尽量保证一个线程占用一个资源。
- 尝试使用定时锁,使用lock.tryLock(timeout) 替代使用内部锁机制;
- 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。
参考:《JAVA并发编程的艺术》