body, table{font-family: 微软雅黑; font-size: 10pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}

死锁问题(复制项目直接ctrl+c;ctrl+v)
█ 同步弊端
☞ 影响效率
☞ 如果出现了嵌套锁,容易产生死锁
█ 死锁问题及其代码
☞ 死锁是指两个以上的线程在执行过程中,因为争夺资源而产生的一种相互等待的现象

Main.java MyLock.java
package com.java.demo;
public class Main {
        public static void main(String[] args) {
                Object obj=new Object();  //这里的obj传到MyThread,这样两个线程共用同一个对象才能锁住
                MyThread t1=new MyThread("中国人",obj);
                MyThread t2=new MyThread("英国人",obj);
                t1.start();
                t2.start();
        }
}
package com.java.demo;
public class MyLock {
        static Object LockA=new Object();
        static Object LockB=new Object();
}
MyThread.java
package com.java.demo;
public class MyThread extends Thread{
        //Object obj;
        public void run(){
                super.run();
                //目的让线程死锁
                if(getName().equals("中国人")){
                        synchronized(MyLock.LockA){   //这里换种方式 ,不用obj
                                System.out.println(getName()+"MyThread.run() 我得到了A锁,要继续执行的话需要B锁");
                                synchronized(MyLock.LockB){
                                        System.out.println(getName()+"MyThread.run() 我得到了B锁");
                                        System.out.println(getName()+"MyThread.run() 我两把锁都得到了,开始工作");
                                }
                        }
                }
                else if(getName().equals("英国人")){
                        synchronized(MyLock.LockB){
                                System.out.println(getName()+"MyThread.run() 我得到了B锁,要继续执行的话需要A锁");
                                synchronized(MyLock.LockA){
                                        System.out.println(getName()+"MyThread.run() 我得到了A锁");
                                        System.out.println(getName()+"MyThread.run() 我两把锁都得到了,开始工作");
                                }
                        }
                }
        }
        public MyThread(String name,Object obj){
                super(name);
                //this.obj=obj;
        }
}

Java——线程死锁问题的更多相关文章

  1. Java线程死锁查看分析方法

    如何查看是否有Java线程死锁?下面介绍两种方法. 一.Jconsole        Jconsole是JDK自带的图形化界面工具,使用JDK给我们的的工具JConsole,可以通过打开cmd然后输 ...

  2. java 线程死锁的检测

    java 线程死锁的检测   例子程序: import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executo ...

  3. 55行代码实现Java线程死锁

    死锁是Java多线程的重要概念之一,也经常出现在各大公司的笔试面试之中.那么如何创造出一个简单的死锁情况?请看代码: class Test implements Runnable { boolean ...

  4. 一个Java线程死锁的例子

    package com.lk.B; public class Test4 { private static final Object o1 = new Object(); private static ...

  5. JAVA线程死锁

    文件名:DeadThreadByExtend.java 注: 1.起线程的时候用的是start方法,run方法也可以调用,但是仅仅相当于普通调用,在当前线程内执行. 2.synchronized 不能 ...

  6. 诊断Java线程死锁

    比如我们有运行这样一个程序: 了解多线程的小伙版都知道,这段代码不会有打印结果,因为发生了死锁.我们在服务器上运行试试,没有输出,对应的进程是 32752. 使用 “jstack 32752”排查,后 ...

  7. 【!Important】Java线程死锁查看分析方法

    一.Jconsole Jconsole是JDK自带的图形化界面工具,使用JDK给我们提过的工具JConsole,可以通过cmd打开命令框然后输入Jconsole打开图形工具 然后点击检测死锁就可以查看 ...

  8. Java 多线程 死锁 隐性死锁 数据竞争 恶性数据竞争 错误解决深入分析 全方向举例

    在几乎所有编程语言中,由于多线程引发的错误都有着难以再现的特点,程序的死锁或其它多线程错误可能只在某些特殊的情形下才出现,或在不同的VM上运行同一个程序时错误表现不同.因此,在编写多线程程序时,事先认 ...

  9. [改善Java代码]预防线程死锁

    线程死锁DeadLock是多线程编码中最头疼的问题,也是最难重现的问题,因为Java是单进程多线程语言.

随机推荐

  1. TeeChart的网络资料

    TeeChart坐标轴常见问题 http://www.shaoqun.com/a/54063.aspx TeeChart常用编程语句汇总(C#) http://www.ev get.com/artic ...

  2. [AtCoder ARC101D/ABC107D] Median of Medians

    题目链接 题意:给n个数,求出所有子区间的中位数,组成另外一个序列,求出它的中位数 这里的中位数的定义是:将当前区间排序后,设区间长度为m,则中位数为第m/2+1个数 做法:二分+前缀和+树状数组维护 ...

  3. springboot中配置主从redis

    测试redis的主从配置 redis实例 文件夹名称如下 redis_master_s redis_slaver1_s redis_slaver2_s redis.conf文件 master的redi ...

  4. css布局一屏幕的自适应高度

    css ;;list-style: none;} .top{height: 100px;background-color:orange;} .max{;background-color:skyblue ...

  5. C#学习笔记(九):函数、代码查询和调试

    代码查询和调试 代码查询 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...

  6. 如何加速tomcat启动速度

    在tomcat启动的时候,我们可以做一些优化设置来使得tomcat的启动更快速,下面是一些常见的优化加速启动的方法建议(以tomcat-7.+为例说明). 1.  Jars包 1.1.将一些不必要的j ...

  7. Ubuntu 下 su:authentication failure的解决办法

    Ubuntu下使用 su 切换到超级用户时候遇到下面的问题 su: Authentication failure 解决办法: $ sudo passwd root Enter new UNIX pas ...

  8. shell模拟ctrl c停止

    kill命令可以带信号号码选项,也可以不带. 如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源. 也可以用kill向进程发送特定的信 ...

  9. 软件测试实习生 带人计划 Plan for Training Inten

    临时拟了个提纲,以后慢慢补充吧 序号 培训内容 时间安排 1 根据项目需求,编写测试用例,针对存储过程 2 存储过程的走读,以及怎样执行测试用例和查看结果 3 根据项目需求,编写测试用例,针对接口[C ...

  10. Spring Boot中注解事务