模拟死锁
Posted 迷失之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模拟死锁相关的知识,希望对你有一定的参考价值。
public class A { public void a() { System.out.println(Thread.currentThread().getName() + " in a."); } }
public class B { public void b() { System.out.println(Thread.currentThread().getName() + " in b."); } }
/** * 模拟死锁 */ public class TestDeadLock { /* * 死锁的解决办法: * 对象的加锁顺序一定要一致,比如都是先加a的锁,后加b的锁. */ public static void main(String[] args) { // 两个对象 A a = new A(); B b = new B(); /* * a和b的方法必须同步执行(例如A账户转账给B账户) * 所以a和b的方法执行之前,要要对a对象和b对象都加锁 * * 模拟: * 线程1先给a加锁,给b加锁的时候失败,等待线程2释放b的锁。 * 线程2先给b加锁,给a加锁的时候失败,等待线程1释放a的锁。 */ // 线程1 new Thread(new Runnable() { @Override public void run() { // 先锁a synchronized (a) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 1s后去锁b synchronized (b) { a.a(); b.b(); } } System.out.println(Thread.currentThread().getName() + " done."); } }).start(); // 线程2 new Thread(new Runnable() { @Override public void run() { // 先锁b synchronized (b) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 1s后去锁a synchronized (a) { b.b(); a.a(); } } System.out.println(Thread.currentThread().getName() + " done."); } }).start(); } }
以上是关于模拟死锁的主要内容,如果未能解决你的问题,请参考以下文章