IT辅导娱乐网| 蜘蛛地图| 所有文章|
Java多线程之-死锁 - IT辅导
  • 首页
  • IT技术 IT辅导资源网设计图
    • DVWA靶场
    • sqli-lab靶场
  • 源码基地
  • 软件分享 IT辅导资源网设计图
    • 辅助软件
  • emlog教程
  • 白嫖活动
  • 网络技巧 IT辅导资源网设计图
    • seo教程
  • 编程教程
  • 值得看一看 IT辅导资源网设计图
    • 值得听一听
    • 读懂世界
    • 活动线报
  • 更多功能 IT辅导资源网设计图
    • 在线投稿
    • 公告动态
    • 广告合作
    • 匿名投稿


登录后,享受更多优质服务哦
IT辅导资源网站长qq头像
欢迎回来,可爱的会员!个人中心退出登录
导航菜单
  • 首页
  • IT技术
    • DVWA靶场
    • sqli-lab靶场
  • 源码基地
  • 软件分享
    • 辅助软件
  • emlog教程
  • 白嫖活动
  • 网络技巧
    • seo教程
  • 编程教程
  • 值得看一看
    • 值得听一听
    • 读懂世界
    • 活动线报
  • 更多功能
    • 在线投稿
    • 公告动态
    • 广告合作
    • 匿名投稿

Java多线程之-死锁

2020/9/9 五年级扛把子 


所谓线程死锁是指两个或两个以上的线程互相持有对方所需要的资源,由于synchronized的特性,一个线程持有一个资源,或者说获得一个锁,在该线程释放这个锁之前,其它线程是获取不到这个锁的,而且会一直死等下去,因此这便造成了死锁。


如下图(1-1):




Java多线程中死锁产生的必要条件如下:

  1.互斥条件:一个资源,或者说一个锁只能被一个线程所占用,当一个线程首先获取到这个锁之后,

在该线程释放这个锁之前,其它线程均是无法获取到这个锁的;

  2.占有且等待:一个线程已经获取到一个锁,再获取另一个锁的过程中,即使获取不到也不会释放已

经获得的锁;

  3.不可剥夺条件:任何一个线程都无法强制获取别的线程已经占有的锁;

  4.循环等待条件:线程A拿着线程B的锁,线程B拿着线程A的锁;

当满足以上四个条件时,就出现死锁的情况!!!


public class DeadLock implements  Runnable {
    //创建两个锁对象
    private Object lock1=new Object();
    private Object lock2=new Object();

    @Override
    public void run(){
        while(true){
            method1();
            method2();
        }
    }
    public void method1(){
        synchronized (lock1){
            System.out.println(Thread.currentThread().getName() + “获取到lock1”);
            try {
                Thread.sleep(1000);  //线程休眠,使得CPU切换
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (lock2){
                System.out.println(Thread.currentThread().getName() + "获取到lock2");
            }
        }
    }
    public void method2(){
        synchronized (lock2){
            System.out.println(Thread.currentThread().getName() + "获取到lock2");
            synchronized (lock1){
                System.out.println(Thread.currentThread().getName() + "获取到lock1");
            }
        }
    }

    public static void main(String[] args) {
        DeadLock deadLock = new DeadLock();
        new Thread(deadLock).start();
        new Thread(deadLock).start();
    }

} 

(图3-1)

这样便造成了死锁,Thread1拿着lock1,想要lock2,Thread2拿着lock2,想要lock1.  


Java多线程中如何避免死锁:


  1.加锁顺序:线程按照相同的顺序加锁。


  2.加锁时限,线程获取锁的过程中限制一定的时间,如果给定时间内获取不到,就算了,别勉强自

己。这需要用到Lock的一些API


在发生死锁之后,程序就卡住了没有任何反应,但程序仍在运行,因此需要借助一些

  1.首先使用 jps -l 显示正在运行的虚拟机进程,并显示虚拟机执行主类(main函数所在

的类)名称以及这些进程的本地虚拟机唯一ID


图(5-1)

  2.使用 jstack + id 进行跟踪排查

 

图(5-2)


图(5-3)


 点赞:0  打赏  分享  海报

  • 打赏支付宝扫一扫
  • 打赏微信扫一扫
  • 打赏企鹅扫一扫
结束语
温馨提醒:如有技术问题以及资源失效请联系站长 QQ89549822 进行反馈!!!
 您阅读本文耗时: 0小时02分35秒
热度:314° 发布时间:2020年9月9日

推荐:

标题:Java多线程之-死锁

链接: https://www.itfd.cn/post-1286.html

版权:转载请注明来源于【IT辅导娱乐网】为原创

上一篇: MySql数据库优化方案

下一篇: mysql中int(10)和char(10),varchar(10)区别是什么?

作者头像 作者名称 作者性别
五年级扛把子
联系作者 作者主页

热门推荐

1 Java面向对象的概念以及面向对象的特征
2 《卖淫嫖娼人员收容教育办法》废止
3 关于的电脑的小知识你知道哪些it辅导
4 html中注释的使用说明
5 一男子访问境外网站被行政处罚
6 HTML字符集简介

评论列表

取消回复

  • 存档

    • 2020年9月(191)
    • 2020年8月(92)
    • 2020年7月(5)
    • 2020年6月(224)
    • 2020年5月(392)
    • 2020年4月(267)
    • 2020年3月(76)
    • 2019年3月(1)
    • 1970年1月(29)
  • 搜索

  • 热门文章

    • 神佑之路手游源码-附视频教程
    • 最新可用老王VPN2.22.15谷歌市场版,免费使用
    • 私藏的十个网站,不看后悔系列
    • 虚拟商品自动发货商城源码
    • 不吃苦、不奋斗,你要青春做什么?
  • 随机文章

      • 山西发生3.0级地震 震源深度5千米
        • 和平精英短信到账装X神器
          • 王者荣耀修改国服战绩小助手
            • 超级漂亮的HTML指南页面
              • Steam免费领取 Four Kings One War 游戏
    提示信息

    SQL语句执行错误: SELECT COUNT(*) AS total FROM emlog_twitter
    Table 'itfd.emlog_twitter' doesn't exist

    «点击返回