死锁
/** * 死锁:会导致单线程出现循环 * * 产生的条件: * 同步代码块中,出现多个锁 * 多个线程分别持有自己的锁,还需要其他的锁来共同完成任务 * * 每个线程没有释放自己的锁,就会出现线程之间各自持有对方所需要的锁,所有线程都进入一种无限等待的状态,死锁。 * * 案例:吃饭,各自需要对方的筷子。 */ public class J09DeadLock { public static void main(String[] args) { Person person = new Person(); Thread thread1 = new Thread(person,"A"); Thread thread2 = new Thread(person,"B");
thread1.start(); thread2.start();
System.out.println("主线程执行完毕。"); } } class Person implements Runnable {
//定义两把锁 private String chopsticks1 = new String("第一根筷子"); private String chopsticks2 = new String("第二根筷子");
@Override public void run() { getChopsticks(); }
public void getChopsticks() { String name = Thread.currentThread().getName();
if(name.equals("A")) { synchronized (chopsticks1) { System.out.println(name + "拿到第一根筷子,A准备拿第二根筷子。");
//两个线程进来时,A在拿到第一根筷子时,第二根筷子可能给B拿了,此时不断的等待B释放第二根筷子的锁 synchronized(chopsticks2) { System.out.println(name + "拿到第二根筷子,开始吃饭。"); } } }else { synchronized (chopsticks2) { System.out.println(name + "拿到第二根筷子,B准备拿第一根筷子。");
//两个线程进来时,B在拿到第二根筷子时,第一根筷子可能给A拿了,此时不断的等待A释放第一根筷子的锁 synchronized(chopsticks1) { System.out.println(name + "拿到第一根筷子,开始吃饭。"); } } } } } |
解决死锁
目前死锁是无法解决的,只能在程序逻辑中去定义解决这个问题,普遍做法是设定一个超时时间,并记录到日志中,如果是重要的业务,自然是要加上发送邮件或短信通知了。