6.多线程死锁

1.什么是多线程死锁?

答:同步中嵌套同步,导致锁无法释放锁。

案例演示:

1.创建多线程类

代码中发现:
如果为true需要先拿到object锁,再拿到this锁,才能执行。
如果为false需要先拿到this锁,再拿到object锁,才能执行。

package com.thread.Safety;

public class TrainTicket implements Runnable {

    private static int ticket = 1000;
    private Object object = new Object();
    public boolean flag= true;

    @Override
    public void run() {
        if (flag){
            while (ticket > 0) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                 synchronized (object){
                    show();
                }
            }
        }else {
            while (ticket > 0) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                show();
            }
        }

    }

    private  synchronized void show(){
        synchronized (object){
            if (ticket>0){
                System.out.println(Thread.currentThread().getName() + "--->" + (1000 - ticket + 1));
                ticket--;
            }
        }
    }
}

2.创建测试类:

package com.thread.Safety;

public class TarinTicketDemo {
    public static void main(String[] args) throws InterruptedException {
        TrainTicket trainTicket = new TrainTicket();
        new Thread(trainTicket,"线程一").start();
        Thread.sleep(100);
        trainTicket.flag=false;
        new Thread(trainTicket,"线程二").start();
    }
}

3.查看执行结果(此时发现已经锁了):

D:\Java\jdk1.8.0_101\bin\java "-javaagent:D:\JetBrains\IntelliJ IDEA 2017.3.7\lib\idea_rt.jar=62139:D:\JetBrains\IntelliJ IDEA 2017.3.7\bin" -Dfile.encoding=UTF-8 -classpath D:\Java\jdk1.8.0_101\jre\lib\charsets.jar;D:\Java\jdk1.8.0_101\jre\lib\deploy.jar;D:\Java\jdk1.8.0_101\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_101\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_101\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_101\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_101\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_101\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_101\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_101\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_101\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_101\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_101\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_101\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_101\jre\lib\javaws.jar;D:\Java\jdk1.8.0_101\jre\lib\jce.jar;D:\Java\jdk1.8.0_101\jre\lib\jfr.jar;D:\Java\jdk1.8.0_101\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_101\jre\lib\jsse.jar;D:\Java\jdk1.8.0_101\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_101\jre\lib\plugin.jar;D:\Java\jdk1.8.0_101\jre\lib\resources.jar;D:\Java\jdk1.8.0_101\jre\lib\rt.jar;D:\多线程\target\classes;D:\software\it\maven\LocalResponsitory\com\alibaba\druid\1.0.9\druid-1.0.9.jar;D:\Java\jdk1.8.0_101\lib\jconsole.jar;D:\Java\jdk1.8.0_101\lib\tools.jar;D:\software\it\maven\LocalResponsitory\com\github\noraui\ojdbc8\12.2.0.1\ojdbc8-12.2.0.1.jar;D:\software\it\maven\LocalResponsitory\org\springframework\spring-jdbc\5.1.7.RELEASE\spring-jdbc-5.1.7.RELEASE.jar;D:\software\it\maven\LocalResponsitory\org\springframework\spring-tx\5.1.7.RELEASE\spring-tx-5.1.7.RELEASE.jar;D:\software\it\maven\LocalResponsitory\org\springframework\spring-core\5.1.8.RELEASE\spring-core-5.1.8.RELEASE.jar;D:\software\it\maven\LocalResponsitory\org\springframework\spring-jcl\5.1.8.RELEASE\spring-jcl-5.1.8.RELEASE.jar;D:\software\it\maven\LocalResponsitory\org\springframework\spring-beans\5.1.7.RELEASE\spring-beans-5.1.7.RELEASE.jar;D:\software\it\maven\LocalResponsitory\commons-logging\commons-logging\1.2\commons-logging-1.2.jar com.thread.Safety.TarinTicketDemo
线程一--->1
线程一--->2
线程一--->3
线程一--->4
线程一--->5
线程一--->6
线程一--->7
线程一--->8
线程一--->9
线程二--->10
线程一--->11
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。