标签:get string 必须 syn 方法 runnable rup static override
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(); } }
标签:get string 必须 syn 方法 runnable rup static override
原文地址:https://www.cnblogs.com/zj0208/p/9112500.html