.
死锁演示1 /** * 演示线程的死锁问题 * 1. 死锁的理解: 不同线程分别占用对方的同步资源不放弃,都在等待对方放弃自己需要的同步资源, * 就形成了线程的死锁。 * * 2. 说明: * 1) 出现死锁后,不会出现异常,不会出现提升,只是所有的线程都出于阻塞状态,无法继续。 * 2) 我们使用同步时,要避免出现死锁。 * * @author 阿昌 * @create 2020-10-08 10:27 */ public class ThreadTest { public static void main(String[] args) { StringBuffer s1 = new StringBuffer(); StringBuffer s2 = new StringBuffer(); new Thread(){ @Override public void run() { synchronized (s1){ s1.append("a"); s2.append(1); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } synchronized(s2){ s1.append("b"); s2.append(2); System.out.println(s1); System.out.println(s2); } } } }.start(); new Thread(new Runnable() { @Override public void run() { synchronized (s2){ s1.append("c"); s2.append(3); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } synchronized(s1){ s1.append("d"); s2.append(4); System.out.println(s1); System.out.println(s2); } } } }).start(); } } 死锁代码演示2 class A { public synchronized void foo(B b) { System.out.println("当前线程名: " + Thread.currentThread().getName() + " 进入了A实例的foo方法"); // ① try { Thread.sleep(200); } catch (InterruptedException ex) { ex.printStackTrace(); } System.out.println("当前线程名: " + Thread.currentThread().getName() + " 企图调用B实例的last方法"); // ③ b.last(); } public synchronized void last() { System.out.println("进入了A类的last方法内部"); } } class B { public synchronized void bar(A a) { System.out.println("当前线程名: " + Thread.currentThread().getName() + " 进入了B实例的bar方法"); // ② try { Thread.sleep(200); } catch (InterruptedException ex) { ex.printStackTrace(); } System.out.println("当前线程名: " + Thread.currentThread().getName() + " 企图调用A实例的last方法"); // ④ a.last(); } public synchronized void last() { System.out.println("进入了B类的last方法内部"); } } public class DeadLock implements Runnable { A a = new A(); B b = new B(); public void init() { Thread.currentThread().setName("主线程"); // 调用a对象的foo方法 a.foo(b); System.out.println("进入了主线程之后"); } public void run() { Thread.currentThread().setName("副线程"); // 调用b对象的bar方法 b.bar(a); System.out.println("进入了副线程之后"); } public static void main(String[] args) { DeadLock dl = new DeadLock(); new Thread(dl).start(); dl.init(); } }