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