import sun.rmi.runtime.Log; public class DeadLockTest { public static void main(String[] args) { final Object lockA = new Object(); final Object lockB = new Object(); ProductThreadA productThreadA = new ProductThreadA(lockA,lockB); ProductThreadB productThreadB = new ProductThreadB(lockA,lockB); Thread threadA = new Thread(productThreadA); Thread threadB = new Thread(productThreadB); threadA.start(); threadB.start(); } //生产者A static class ProductThreadA implements Runnable{ private Object lockA; private Object lockB; ProductThreadA(Object lockA,Object lockB){ this.lockA = lockA; this.lockB =lockB; } @Override public void run() { //这里一定要让线程睡一会儿来模拟处理数据 ,要不然的话死锁的现象不会那么的明显.这里就是同步语句块里面,首先获得对象锁lockA,然后执行一些代码,随后我们需要对象锁lockB去执行另外一些代码. synchronized (lockA){ //这里一个log日志 System.out.println("ThreadA lock lockA"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lockB){ //这里一个log日志 System.out.println("ThreadA lock lockB"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } } } //生产者B static class ProductThreadB implements Runnable{ //我们生产的顺序真好好生产者A相反,我们首先需要对象锁lockB,然后需要对象锁lockA. private Object lockA; private Object lockB; ProductThreadB(Object lockA,Object lockB){ this.lockA = lockA; this.lockB =lockB; } @Override public void run() { synchronized (lockB){ //这里一个log日志 System.out.println("ThreadB lock lockB"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lockA){ //这里一个log日志 System.out.println("ThreadB lock lockA"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } } } //这里运行线程 }
Java死锁代码示例
最新推荐文章于 2025-06-19 20:08:24 发布