java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)
死锁:是两个或者两个以上的线程被无限的阻塞,线程之间互相等待所需资源。
线程死锁产生的条件:
- 当两个线程相互调用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多线程安全问题(死锁)相关推荐
- 【Java基础知识回顾篇】之打怪升级Day001
Java基础知识回顾篇之打怪升级Day001 目录 Java基础知识回顾篇之打怪升级Day001 简介 一.为什么现在主流的是Java8和Java11? 二.简单尝试编写java程序 1.编写一个He ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- Java基础知识运用,用对象,线程,Java窗口画出太阳系
一个项目让你搞懂对象:Java基础知识运用,用对象,线程,GUI画出太阳系 一.需求分析: 用java基础知识画出太阳系八大行星的运行轨迹图,要求:运行轨迹图是动态图片,画出运行轨迹,画出地月系(不需 ...
- JAVA基础知识回顾-----File类-----实用
所在包:java.io 1.文件 Java对文件管理,主要用到了IO包下的File类:主要针对文件及文件目录名称的管理,不包括文件的内容 ①声明 Java代码 public clas ...
- Java基础知识回顾--线程
基本概念 线程是一个程序内部的顺序控制流 Java的线程是通过java.lang.Thread类来实现的.main函数是一个主线程,用户可以通过创建Thread的实例来创建新的线程.每一个线程都必须实 ...
- Java基础知识回顾之一 ----- 基本数据类型
前言 在开始工作至今,学习各种各样的技术之中发现自己的很多Java的基础知识都忘了⊙﹏⊙b汗... 而且越是学习越是发现Java基础的重要性,所以准备单独抽一下时间进行Java基础的重新学习.在重新学 ...
- Java基础知识回顾
1.Java集合 (1).几种集合(List.Set和Map)的区别 JAVA中几种集合(List.Set和Map)的区别 java常用集合总结 Java集合类: Set.Lis ...
- java基础知识回顾之javaIO类总结
java IO体系图 IO流的操作规律总结: 1,明确体系: 数据源:InputStream ,Reader 数据汇:OutputStream,Writer 2,明确数据:因为数据分两种:字节,字符. ...
- java基础知识回顾之javaIO类---FileInputStream和FileOutputStream字节流复制图片
package com.lp.ecjtu;import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
最新文章
- 毕业即失业?你到底在焦虑什么
- 【源码解读】Vue与ASP.NET Core WebAPI的集成
- [RabbitMQ]工作原理_原理名词解释
- 6 操作系统第二章 进程管理 处理机调度
- 如果mysql磁盘满了,会发生什么?还真被我遇到了~
- java put请求_计算机毕业设计中用java实现小程序推送(springboot实现)
- 个人CTF入门训练过程WriteUp
- html5中audio支持音频格式
- java ts流,Windows 合并多个*.ts文件
- JDK源码阅读之Long
- iPhone手机越狱不只是为了安装盗版应用、越狱的十大好处
- k8s笔记20--基于 K8S 的 cicd 概述
- springmvc mybatis shiro springsecurity lucene restful webservice bootstrap html5
- 香橙派 OrangePi Zero2 配置指南2-改名改密改IP
- 为何日本手机走不出国门—iFanr版
- 无座火车票为什么不能半价?
- 使用Datadog在docker环境下监控Java, Tomcat, Nginx, Kfaka, ZooKeeper
- 关于淘宝网评论数据的抓取
- Macbook windows 10系统下录屏软件无法录制系统声音的问题
- hexo-theme-next @modified LRH