package com.founder.rhip.drs.controller; /** *死锁:指两个或者两个以上线程在执行过程中因为争夺资源而造成的一种相互等待的现象。若无外力干涉,他们将一直等待下去。 * 如果系统资源重组,进程的资源请求都能得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。 * *产生原因: * 1系统资源不足 * 2进程运行推进的顺序不合适 * 3资源分配不当 * *解决: * jps命令定位进程号:jps -l * jstack找到死锁查看:jstack 进程号 * */ public class DeathLockDemo { public static void main(String[] args) { String lockA = "lockA"; String lockB = "lockB"; Thread thread1 = new Thread(new HoldLockThread(lockA, lockB),"AA"); thread1.start(); Thread thread2 = new Thread(new HoldLockThread(lockB, lockA),"BB"); thread2.start(); /** * 得到线程号: *linux ps -ef|grep xxxx ls -l * * windows下的java运行程序 查看进程的命令, 查看java * jps = java ps jps -l * * * 查看stack: * jstack 进程号 * *结果: * Java stack information for the threads listed above: * =================================================== * "BB": * at com.founder.rhip.drs.controller.HoldLcokThread.run(DeathLockDemo.java:44) * - waiting to lock <0x00000000d690a358> (a java.lang.String) * - locked <0x00000000d690a390> (a java.lang.String) * at java.lang.Thread.run(Thread.java:745) * "AA": * at com.founder.rhip.drs.controller.HoldLcokThread.run(DeathLockDemo.java:44) * - waiting to lock <0x00000000d690a390> (a java.lang.String) * - locked <0x00000000d690a358> (a java.lang.String) * at java.lang.Thread.run(Thread.java:745) * * Found 1 deadlock. */ } } class HoldLockThread implements Runnable{ private String lockA; private String lockB; HoldLockThread( String lockA, String lockB){ this.lockA = lockA; this.lockB = lockB; } @Override public void run() { synchronized (lockA){ System.out.println(Thread.currentThread().getName()+"已经获得锁"+lockA); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"尝试获得锁"+lockB); synchronized (lockB){ System.out.println(Thread.currentThread().getName()+"已经获得锁"+lockB); } } } }
死锁 产生原因 如何查看
最新推荐文章于 2022-06-28 11:42:23 发布