Java多线程 演示死锁的发生
发布日期:2021-06-30 13:12:05
浏览次数:3
分类:技术文章
本文共 1811 字,大约阅读时间需要 6 分钟。
文章目录
演示死锁的发生
如下的代码演示了死锁的发生.
在run方法中, flag等于1 的时候, 线程1 ,获得了锁1, 需要拿到锁2 . flag等于2的时候, 线程2获得了锁2 ,需要拿到锁1, 创建两个线程的时候, 给线程1的flag赋值为1 , 线程2赋值为2.这样创建线程, 启动线程的时候, 线程1 和2 分别拥有了锁1 和2 ,但是同时又需要拿到锁2和1 . 线程1和2也没有释放锁1和2. 这样就造成了相互等待锁资源,造成了死锁的发生.
package com.thread.background;/** * 类名称:DeadLockDemo * 类描述: 线程安全问题,演示死锁。 * * @author: https://javaweixin6.blog.csdn.net/ * 创建时间:2020/9/1 7:22 * Version 1.0 */public class DeadLockDemo implements Runnable { int flag = 1; //两把锁 static Object o1 = new Object(); static Object o2 = new Object(); public static void main(String[] args) { DeadLockDemo r1 = new DeadLockDemo(); DeadLockDemo r2 = new DeadLockDemo(); r1.flag=1; r2.flag=2; new Thread(r1,"thread1").start(); new Thread(r2,"thread2").start(); } @Override public void run() { System.out.println(Thread.currentThread().getName()+ " flag = " + flag); if (flag == 1) { //获取第一把锁 synchronized (o1) { try { Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } //获取第二把锁 synchronized (o2) { System.out.println("1"); } } } if (flag == 2) { //获取第一把锁 synchronized (o2) { try { Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } //获取第二把锁 synchronized (o1) { System.out.println("2"); } } } }}
运行程序可以看到线程1和2 分别进入run方法打印了输出语句之后, 就进入了死锁的阶段.
控制台的红色按钮一直亮着 ,说明程序一直在运行中, 发生了死锁.转载地址:https://javaweixin6.blog.csdn.net/article/details/108333257 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月07日 21时56分37秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
DataURL:实现员工头像保存
2019-05-01
DataURL:员工头像回显
2019-05-01
七牛云存储:断点续传
2019-05-01
JasperReport:声明周期
2019-05-01
递归求阶乘
2019-05-01
递归遍历目录
2019-05-01
IO流概述和分类
2019-05-01
字节流写数据
2019-05-01
字节流写数据的三种方式
2019-05-01
字节流写数据的两个小问题
2019-05-01
字节流写数据加异常处理
2019-05-01
字节流复制文本文件【应用】
2019-05-01
字节流复制图片
2019-05-01
字节缓冲流构造方法
2019-05-01
字节流复制视频
2019-05-01
字符流读数据的2种方式
2019-05-01
字符流复制Java文件
2019-05-01
字符流复制Java文件改进版
2019-05-01
类加载器【理解】
2019-05-01
其他数字摘要算法实现
2019-05-01