小白的多线程修行之路-多线程的死锁

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嵌套代码结构来实现死锁,即使不使用嵌套有时候也会造成死锁,希望不要被误导!!!

猜你喜欢

转载自blog.csdn.net/weixin_42163781/article/details/105224671