赞
踩
死锁代码:
- import java.util.concurrent.CountDownLatch;
-
- public class DeadLock {
-
- public static String obj1 = "obj1";//资源1
- public static String obj2 = "obj2";//资源2
- public static void main(String[] args) throws Exception{
- final CountDownLatch countdown = new CountDownLatch(1);
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- countdown.await();//都进入等待
- synchronized(DeadLock.obj1){
- System.out.println(Thread.currentThread()+"has lock obj1");
- Thread.sleep(3000);//获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2
- System.out.println(Thread.currentThread()+"ready to lock obj2");
- synchronized(DeadLock.obj2){
- System.out.println(Thread.currentThread()+"has lock obj2");
- }
- }
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- },"thread1" ).start();
-
- new Thread(new Runnable() {
- @Override
- public void run() {
- try {
- countdown.await();//都进入等待
- synchronized(DeadLock.obj2){
- System.out.println(Thread.currentThread()+"has lock obj2");
- Thread.sleep(3000);//获取obj1后先等一会儿,让Lock2有足够的时间锁住obj2
- System.out.println(Thread.currentThread()+"ready to lock obj1");
- synchronized(DeadLock.obj1){
- System.out.println(Thread.currentThread()+"has lock obj1");
- }
- }
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- },"thread2" ).start();
-
- countdown.countDown();
- }
-
- }
如何在命令行查看死锁问题?
①jps -l 查看java进程信息;
②jstack -l pid | more 查看当前java进程的堆栈状态
可以看到两个线程之间互相占用对方资源,等待释放,产生阻塞死锁。
在top命令中,已经获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可;隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别,在nid=0x229c的线程调用栈中,发现该线程一直在执行DeadLock类第40行的run方法,得到这个信息,就可以检查对应的代码是否有问题。
解决方法: https://blog.csdn.net/MrLiar17/article/details/86623614
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。