死锁:是两个或者两个以上的线程被无限的阻塞,线程之间互相等待所需资源。

线程死锁产生的条件:

  • 当两个线程相互调用Join()方法。
  • 当两个线程使用嵌套的同步代码块的时候,一个线程占用了另一个线程的锁,互相等待阻塞,就有可能产生死锁。

下面看代码:

代码1:死锁的案例

package com.lp.ecjtu.Thread;/*
死锁:常见情景之一:同步的嵌套。*/
class Ticket implements Runnable
{private  int num = 100;Object obj = new Object();boolean flag = true;public void run(){if(flag)while(true){synchronized(obj)//同步代码块里面调用同步函数
                {show();}}elsewhile(true)this.show();}public synchronized void show()//同步函数里面的调用同步代码块
    {synchronized(obj){if(num>0){try{Thread.sleep(10);}catch (InterruptedException e){}System.out.println(Thread.currentThread().getName()+".....sale...."+num--);}}}
}public class DeathLockThread1
{public static void main(String[] args) {Ticket t = new Ticket();Thread t1 = new Thread(t);Thread t2 = new Thread(t);t1.start();try{Thread.sleep(10);}catch(InterruptedException e){}t.flag = false;t2.start();}
}

代码2:

package com.lp.ecjtu.Thread;class DeathLockRunable implements Runnable{private boolean flag;public DeathLockRunable(boolean flag){this.flag = flag;}@Overridepublic void run() {if(flag){synchronized (Lock.mylock1){System.out.println("if mylock1"+Thread.currentThread().getName());synchronized (Lock.mylock2){System.out.println("if mylock2"+Thread.currentThread().getName());}}}else{synchronized (Lock.mylock2){System.out.println("else mylock2"+Thread.currentThread().getName());synchronized (Lock.mylock1){System.out.println("else mylock1"+Thread.currentThread().getName());}}}}}class Lock{static Object mylock1 = new Object();static Object mylock2 = new Object();}public class DeathLockThread{public static void main(String[] args){Thread t1 = new Thread(new DeathLockRunable(true));Thread t2 = new Thread(new DeathLockRunable(false));t1.start();t2.start();}}

输出结果:if mylock1Thread-0
else mylock2Thread-1

java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)相关推荐

  1. 【Java基础知识回顾篇】之打怪升级Day001

    Java基础知识回顾篇之打怪升级Day001 目录 Java基础知识回顾篇之打怪升级Day001 简介 一.为什么现在主流的是Java8和Java11? 二.简单尝试编写java程序 1.编写一个He ...

  2. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

  3. Java基础知识运用,用对象,线程,Java窗口画出太阳系

    一个项目让你搞懂对象:Java基础知识运用,用对象,线程,GUI画出太阳系 一.需求分析: 用java基础知识画出太阳系八大行星的运行轨迹图,要求:运行轨迹图是动态图片,画出运行轨迹,画出地月系(不需 ...

  4. JAVA基础知识回顾-----File类-----实用

    所在包:java.io 1.文件 Java对文件管理,主要用到了IO包下的File类:主要针对文件及文件目录名称的管理,不包括文件的内容        ①声明 Java代码   public clas ...

  5. Java基础知识回顾--线程

    基本概念 线程是一个程序内部的顺序控制流 Java的线程是通过java.lang.Thread类来实现的.main函数是一个主线程,用户可以通过创建Thread的实例来创建新的线程.每一个线程都必须实 ...

  6. Java基础知识回顾之一 ----- 基本数据类型

    前言 在开始工作至今,学习各种各样的技术之中发现自己的很多Java的基础知识都忘了⊙﹏⊙b汗... 而且越是学习越是发现Java基础的重要性,所以准备单独抽一下时间进行Java基础的重新学习.在重新学 ...

  7. Java基础知识回顾

    1.Java集合 (1).几种集合(List.Set和Map)的区别          JAVA中几种集合(List.Set和Map)的区别   java常用集合总结 Java集合类: Set.Lis ...

  8. java基础知识回顾之javaIO类总结

    java IO体系图 IO流的操作规律总结: 1,明确体系: 数据源:InputStream ,Reader 数据汇:OutputStream,Writer 2,明确数据:因为数据分两种:字节,字符. ...

  9. java基础知识回顾之javaIO类---FileInputStream和FileOutputStream字节流复制图片

    package com.lp.ecjtu;import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

最新文章

  1. 毕业即失业?你到底在焦虑什么
  2. 【源码解读】Vue与ASP.NET Core WebAPI的集成
  3. [RabbitMQ]工作原理_原理名词解释
  4. 6 操作系统第二章 进程管理 处理机调度
  5. 如果mysql磁盘满了,会发生什么?还真被我遇到了~
  6. java put请求_计算机毕业设计中用java实现小程序推送(springboot实现)
  7. 个人CTF入门训练过程WriteUp
  8. html5中audio支持音频格式
  9. java ts流,Windows 合并多个*.ts文件
  10. JDK源码阅读之Long
  11. iPhone手机越狱不只是为了安装盗版应用、越狱的十大好处
  12. k8s笔记20--基于 K8S 的 cicd 概述
  13. springmvc mybatis shiro springsecurity lucene restful webservice bootstrap html5
  14. 香橙派 OrangePi Zero2 配置指南2-改名改密改IP
  15. 为何日本手机走不出国门—iFanr版
  16. 无座火车票为什么不能半价?
  17. 使用Datadog在docker环境下监控Java, Tomcat, Nginx, Kfaka, ZooKeeper
  18. 关于淘宝网评论数据的抓取
  19. Macbook windows 10系统下录屏软件无法录制系统声音的问题
  20. hexo-theme-next @modified LRH

热门文章

  1. 【学习求职必备】百度AI和它的7大AI黑科技
  2. 2021年速卖通828年中大促活动报名攻略
  3. 全球及中国燃料乙醇行业产量规模及供需前景分析报告2021-2027年
  4. 风寒感冒与风热感冒的区分与治疗
  5. 成立阿里大农业兄弟连-万祥军:农民丰收节交易会乡村脱贫
  6. 视频分解图片原理;图片合成视频原理
  7. 如何共享自己的mysql
  8. websocket与ajax的区别浅析
  9. 51单片机 | 中断系统概念及结构
  10. wiki-editor语法