java死锁是一个经典的问题,因为线程等待根本不可能被释放的锁,导致任务无法完成,在多线程中死锁时必须避免的,这会造成线程的假死。
造成死锁的示例:
public class ThreadTest {
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.setFlag("a");
Thread thread = new Thread(myThread);
thread.start();
Thread.sleep(100);
myThread.setFlag("b");
Thread thread1 = new Thread(myThread);
thread1.start();
}catch (Exception e){
e.printStackTrace();
}
}
}
class MyThread implements Runnable{
public String username;
public Object lock1 = new Object();
public Object lock2 = new Object();
public void setFlag(String username){
this.username = username;
}
@Override
public void run() {
if(username.equals("a")){
synchronized (lock1) {
try {
System.out.println("username = "+username);
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2){
System.out.println("按lock1->lock2代码顺序执行");
}
}
}
if(username.equals("b")){
synchronized (lock2){
try {
System.out.println("username = "+username);
Thread.sleep(3000);
}catch (Exception e){
e.printStackTrace();
}
synchronized (lock1){
System.out.println("按lock2->lock1代码顺序执行");
}
}
}
}
}
运行结果:
查看线程死锁可以通过jdk自带的工具来检测是否发生死锁的现象,打开cmd工具进入jdk的bin目录下,通过jps命令找到对应的程序的id值
执行jstack id,可以查看结果
死锁是程序设计的bug,在设计程序时,就要避免双方互相持有对方锁的情况,本示例使用synchronized嵌套代码结构来实现死锁,即使不使用嵌套有时候也会造成死锁,希望不要被误导!!!