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. FAST:通过Floodlight控制器下发流表

    参考: Floodlight+Mininet搭建OpenFlow(四):流表操作 通过Floodlight控制器下发流表 下发流表的方式有两种: 1.借助Floodlight的北向API,利用curl ...

  2. POJ 2506 Tiling(递推+大整数加法)

    http://poj.org/problem?id=2506 题意: 思路:递推.a[i]=a[i-1]+2*a[i-2]. 计算的时候是大整数加法.错了好久,忘记考虑1了...晕倒. #includ ...

  3. axios post请求报错

    问题描述: vue中使用axios提交post请求, 请求地址及参数都对, 但是一直报缺少参数的错误 探索:对比post请求数据, 提交数据的方式不对 (1)axios的post请求(返回响应缺少参数 ...

  4. STL_算法_04_算术和生成算法

    ◆ 常用的算术和生成算法: 1.1.求和( accumulate 是求和的意思)(对指定范围内的元素求和,然后结果再加上一个由val指定的初始值.) T accumulate(iteratorBegi ...

  5. android 管理fragment

    要管理fragment们,需使用FragmentManager,要获取它,需在activity中调用方法getFragmentManager(). 你可以用FragmentManager来做以上事情: ...

  6. URAL 1741 Communication Fiend

    URAL 1741 思路: dp 状态:dp[i][1]表示到第i个版本为正版的最少流量花费 dp[i][0]表示到第i个版本为盗版的最少流量花费 初始状态:dp[1][0]=dp[0][0]=0 目 ...

  7. rem的计算

    (function (doc, win) { console.log("dpr:"+win.devicePixelRatio); var docEle = doc.document ...

  8. nodejs 监听文件夹变化的模块

    使用Node.JS监听文件夹变化 fs.watch 其中Node.JS的文件系统也可侦听某个目录的改变, 如fs.watch   其中fs.watch的最大缺点就是不支持子文件夹的侦听,并且在很多情况 ...

  9. 小行星碰撞 Asteroid Collision

    2018-08-07 11:12:01 问题描述: 问题求解: 使用一个链表模拟栈,最后的状态一定是左侧全部是负值,表示的是向左飞行,右侧的全部是正值,表示的是向右飞行. 遍历整个数组,对于每个读到的 ...

  10. 消息队列Kafka学习记录

    Kafka其实只是众多消息队列中的一种,对于Kafka的具体释义我这里就不多说了,详见:http://baike.baidu.com/link?url=HWFYszYuMdP_lueFH5bmYnlm ...