多线程的死锁..死锁不是死了而是线程互相等待...

在项目中可能就是在几十万行的代码中存在一个死锁的问题,如何发现这个问题并且解决这个问题.

JavaJDK为我们提供了一个诊断工具叫做ThreadDump

想当于在某个时刻,给所有的Java线程照了一张照片,这个照片是一个文本信息.我们可以分析这个文本信息,找到死锁...

这个工具不用单独的安装,装好了JDK这个工具就有了.

要得到这个ThreadDump信息,Windows和Linux上有点不太一样...

windows上是按ctrl+break

linux上是kill -3 pid

示例死锁代码DeadLock.java:

  1. public class DeadLock {
  2.  
  3. final Object lockA = new Object();
  4. final Object lockB = new Object();
  5.  
  6. public static void main(String[] args) {
  7. DeadLock demo = new DeadLock();
  8. demo.startLock();
  9. }
  10.  
  11. public void startLock(){
  12. ThreadA a= new ThreadA(lockA,lockB);
  13. ThreadB b= new ThreadB(lockA,lockB);
  14.  
  15. //start threads
  16. a.start();
  17. b.start();
  18. }
  19.  
  20. }
  21.  
  22. class ThreadA extends Thread{
  23.  
  24. private Object lockA = null;
  25. private Object lockB = null;
  26.  
  27. public ThreadA(Object a, Object b){
  28. this.lockA = a;
  29. this.lockB = b;
  30. }
  31.  
  32. public void run() {
  33. synchronized (lockA) {
  34. System.out.println("*** Thread A: ***: Lock A" );
  35. try {
  36. sleep(3000);
  37. } catch (InterruptedException e) {
  38. e.printStackTrace();
  39. }
  40. synchronized (lockB) {
  41. System.out.println("*** Thread A: ***: Lock B" );
  42. }
  43. }
  44.  
  45. System.out.println("*** Thread A: ***: Finished" );
  46. }
  47.  
  48. }
  49.  
  50. class ThreadB extends Thread{
  51.  
  52. private Object lockA = null;
  53. private Object lockB = null;
  54.  
  55. public ThreadB(Object a, Object b){
  56. this.lockA = a;
  57. this.lockB = b;
  58. }
  59. public void run() {
  60. synchronized (lockB) {
  61. System.out.println("*** Thread B: ***: Lock B" );
  62. try {
  63. sleep(3000);
  64. } catch (InterruptedException e) {
  65. e.printStackTrace();
  66. }
  67. synchronized (lockA) {
  68. System.out.println("*** Thread B: ***: Lock A" );
  69. }
  70. }
  71.  
  72. System.out.println("*** Thread B: ***: Finished" );
  73. }
  74.  
  75. }

在命令行上运行:

通过ThreadDump来找到死锁的地方. 在windows上按ctrl+break...

下面是死锁的相关信息,说出了原因,定位到了具体的某一行..这个信息非常有用...

JDK中ThreadDump诊断Java代码中的线程死锁问题的更多相关文章

  1. 诊断Java代码中常见的数据库性能热点问题应该这么做!

    “你的Java应用程序的性能是怎样诊断和优化的?不妨看看这两位西医的方子.如果你有更好疗效的药方,也欢迎在评论区告诉我们. 当我在帮助一些开发者或架构师分析及优化Java应用程序的性能时,关键往往不在 ...

  2. paip.获取proxool的配置 xml读取通过jdk xml 初始化c3c0在代码中总结

    paip.获取proxool的配置  xml读取通过jdk xml 初始化c3c0在代码中  xml读取通过jdk xml 初始化c3c0在代码中.. ... 作者Attilax  艾龙,  EMAI ...

  3. Spring MVC框架下在java代码中访问applicationContext.xml文件中配置的文件(可以用于读取配置文件内容)

    <bean id="propertyConfigurer" class="com.****.framework.core.SpringPropertiesUtil& ...

  4. 使用mongo-java-driver3.0.2.jar和mongodb3.0在java代码中的用户验证4

    以下是使用mongo-java-driver3.0.2.jar和mongodb3.0.4在java代码中的用户验证: ServerAddress sa = new ServerAddress(host ...

  5. Android color(颜色) 在XML文件和java代码中

    Android color(颜色) 在XML文件和java代码中,有需要的朋友可以参考下. 1.使用Color类的常量,如: int color = Color.BLUE;//创建一个蓝色 是使用An ...

  6. 关于在Java代码中写Sql语句需要注意的问题

    最近做程序,时不时需要自己去手动将sql语句直接写入到Java代码中,写入sql语句时,需要注意几个小问题. 先看我之前写的几句简单的sql语句,自以为没有问题,但是编译直接报错. String st ...

  7. java代码中获取进程process id(转)

    另一方面,线程ID=进程ID+内部线程对象ID并不成立,    参考: blog.csdn.net/heyetina/article/details/6633901     如何在java代码中获取进 ...

  8. android中在java代码中设置Button按钮的背景颜色

    android中在java代码中设置Button按钮的背景颜色 1.设置背景图片,图片来源于drawable: flightInfoPanel.setBackgroundDrawable(getRes ...

  9. Java代码中获取Json的key值

    测试json字符串: {"access_token":"hkbQl5o_l67dZ7_vJRATKBwTLk9Yj5QyMuOJThAr8Baj0xWf4wxW1p4ym ...

随机推荐

  1. PHP Libevent扩展安装及应用

    http://www.phpddt.com/php/libevent.html PHP Libevent扩展安装及应用

  2. Curator之Recipes之锁

    转载自:https://blog.csdn.net/kiss_the_sun/article/details/50221463 参考文档: http://ifeve.com/java_lock_see ...

  3. tp5 excel导出类

    1.引入Loader use think\Loader; 2.导出方法: /** * excel表格导出 * @param string $fileName 文件名称 * @param array $ ...

  4. 利用nginx打造个人简历网页

    1.下载nginx nginx官方网址:http://nginx.org/ 2.下载和解压 #下载:[root@iZwz9cl4i8oy1reej7o8pmZ soft]# wget http://n ...

  5. 20169207《Linux内核原理与分析》第十周作业

    这周除了阅读学习教材「Linux内核设计与实现 (Linux Kernel Development)」第教材第15,16章外.我们还需要接着完成学习MOOC「Linux内核分析」第八讲「Linux系统 ...

  6. execl 导出

    /** * 导出   是把数表中的数据添加到execl表中 */ public function export(){ $xlsData = Db('user')->select(); Vendo ...

  7. 用命令行上传本地代码到GitHub

    有两种方式上传,ssh和https,ssh老是报错=.=我用的是https 先下载git   https://git-scm.com/downloads 在代码的文件夹的同级目录中邮件打开git ba ...

  8. cxGrid实现取消过滤和排序后定位到首行(单选和多选)

    cxGrid实现取消过滤和排序后定位到首行(单选和多选) 原创 2013年10月06日 18:42:24 2107 DataContoller中的函数FocusedRecordIndex没有反应,Fo ...

  9. jQuery WeUI V0.4.2 发布

    http://www.oschina.net/news/71590/jquery-weui-v0-4-2 jQuery WeUI V0.4.2 发布了! jQuery WeUI 中使用的是官方WeUI ...

  10. Android-WebView与本地HTML (HTML调用-->Java的方法)

    上一篇博客 Android-WebView加载网络图片&网页 介绍了 使用WebView去加载网络上的图片与网页; 此篇博客专门介绍 Android-WebView与本地HTML (HTML调 ...