多线程 - 8.死锁与循环

synchronized 同步方法的无限等待
class MyService{
    synchronized public void myMethodA() {
        System.out.println("methodA--死循环开始");
        boolean flag = true;
        while(flag) {}
        System.out.println("methodA--死循环结束");
    }
    synchronized public void myMethodB() {
        System.out.println("methodB——开始");
        System.out.println("methodB--结束");
    }
}
class ThreadA extends Thread{
    private MyService myService;
    public ThreadA(MyService myService) {
        super();
        this.myService = myService;
    }
    @Override
    public void run() {
        myService.myMethodA();
    }
}
class ThreadB extends Thread{
    private MyService myService;
    public ThreadB(MyService myService) {
        super();
        this.myService = myService;
    }
    @Override
    public void run() {
        myService.myMethodB();
    }
}
public class test0 {
    public static void main(String[] args) {
        MyService myService = new MyService();
        Thread a = new ThreadA(myService);
        a.setName("a");
        a.start();
        Thread b = new ThreadB(myService);
        b.setName("b");
        b.start();
    }
}

methodA–死循环开始

修改同步方法 myMethodA()

private Object obj = new Object();
    public void myMethodA() {
        synchronized(obj){
            System.out.println("methodA--死循环开始");
            boolean flag = true;
            while(flag) {}
            System.out.println("methodA--死循环结束");
        }
    }

methodA–死循环开始
methodB——开始
methodB–结束

但是程序依旧没有停止

多线程的死锁
class ThreadA implements Runnable{
    public String username;
    private Object obj1 = new Object();
    private Object obj2 = new Object();
    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public void run() {
        if (username.equals("zhangfangxing")) {
            synchronized (obj1) {
                System.out.println("zhangfangxing obj1 username: " + username + ",threadname:" + Thread.currentThread().getName());
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj2) {
                    System.out.println("zhangfangxing obj2" + ",threadname: " + Thread.currentThread().getName());
                }
            }
        }
        if (username.equals("zfx")) {
            synchronized (obj2) {
                System.out.println("zfx obj1 username:" + username + ",threadname: " + Thread.currentThread().getName());
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (obj1) {
                    System.out.println("zfx obj2" + ",threadname: " + Thread.currentThread().getName());
                }
            }
        }
    }
}

public class test1 {
    public static void main(String[] args) {
        ThreadA a = new ThreadA();
        a.setUsername("zhangfangxing");
        Thread t1 = new Thread(a);
        t1.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        a.setUsername("zfx");
        Thread t2 = new Thread(a);
        t2.start();
    }
}

zhangfangxing obj1 username: zhangfangxing,threadname:Thread-0
zfx obj1 username:zfx,threadname: Thread-1

  1. Java 源生自带的工具,其地址在 $JAVA_HOME/bin 目录下。
  2. jps(Java Virtual Machine Process Status Tool) 是 java 提供的一个显示当前所有 java 进程 pid 的命令,适合在 linux/unix 平台上简单察看当前 java 进程的一些简单情况。
  3. jstack 是 JDK 自带的线程堆栈分析工具,使用该命令可以查看或导出 Java 应用程序中线程堆栈信息。

猜你喜欢

转载自blog.csdn.net/weixin_43845524/article/details/106806664