Java 死锁
死锁代码Demo
private void testDeadLock() {
final Object lockA = new Object();
final Object lockB = new Object();
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lockA) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB) {
Log.i("qinxue", "thread1 ");
}
}
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lockB) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockA) {
Log.i("qinxue", "thread2");
}
}
}
});
thread1.start();
thread2.start();
}
分析
线程1:获取lockA,500ms后获取lockB才能继续执行打印"thread1"代码。
线程2:获取lockB,1000ms后获取lockA才能继续执行打印"thread2"代码。
死锁:
总结
显示中的死锁多为一些异常情况没有释放锁(死循环),或者使用java多线程锁不当引起,应该避免手写多线程编程,多使用JDK并发包中的并发容器和工具类来解决并发问题,因为这些类都已经通过了充分的测试和优化。