突发奇想-怎么写一个死锁?
刚把手头上的项目代码撸完,闲来看看博客,然后就看到了线程这块的东西。之前有简单的记录过线程和进行的零碎知识。
JAVA基础知识系列---进程、线程安全
看着看着就想着怎么能写一个死锁呢,打开eclipse,突然感觉无从下手;之前都是一直在解决阻塞、死锁这些问题,现在反过来去写一个死锁感觉有点莫名奇妙。。。
ok,写一个死锁就要有一种场景,并且满足死锁的条件。
- 互斥条件:一个资源每次只能被一个进程使用。
- 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
- 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
- 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
首先要有竞争的资源,并且两个线程要同时都在等待对方释放资源。那我们先弄两个资源:
Object lock=new Object();
Object lock2=new Object();
复制代码
然后有两个线程:
Tr1 tr1=new Tr1(lock, lock2);
Tr2 tr2=new Tr2(lock, lock2);Thread t1=new Thread(tr1);
Thread t2=new Thread(tr2);
复制代码
启动:
t1.start();
t2.start();
复制代码
那么对于lock,lock2怎么再线程内部产生竞争关系呢?来看代码:
package com.glmapper.base.synchronize;public class Tr1 implements Runnable {Object lock;Object lock2;public Tr1(Object lock,Object lock2){this.lock= lock;this.lock2= lock2;}@Overridepublic void run() {//获取locksynchronized (lock) {System.out.println(Thread.currentThread().getName()+"获取了lock锁");try {Thread.sleep(3000);} catch (Exception e) {}//获取lock2synchronized (lock2) {System.out.println(Thread.currentThread().getName()+"获取了lock2锁");}}}
}public class Tr2 implements Runnable {Object lock;Object lock2;public Tr2(Object lock,Object lock2){this.lock= lock;this.lock2= lock2;}@Overridepublic void run() {//获取lock2synchronized (lock2) {System.out.println(Thread.currentThread().getName()+"获取了lock2锁");try {Thread.sleep(3000);} catch (Exception e) {}//获取locksynchronized (lock) {System.out.println(Thread.currentThread().getName()+"获取了lock锁");}}}
}复制代码
分析一下:当线程1获取lock时,线程2获取了lock2锁;然后线程1继续执行,到这里,
synchronized (lock2) {System.out.println(Thread.currentThread().getName()+"获取了lock2锁");
}
复制代码
此时需要获取到lock2这个锁,但是lock2现在被线程2持有;同时,线程2也开始执行到:
synchronized (lock) {System.out.println(Thread.currentThread().getName()+"获取了lock锁");
}
复制代码
此时线程2也在尝试获取lock这把锁,但是lock又被线程1持有了。两个线程都在等待对方释放资源,造成了死锁。OK,完成了。。。
当我准备关机时,发现还在等呢?
??那为什么呢?? 我们开看下发生了什么....
- 通过jps来看下我们程序进程
- 使用jstack -l 【pid】 来看下信息
两个线程都处于BLOCKED状态了...,继续往下看 found 1 deadlock.如我们所愿,死锁发生了!
突发奇想-怎么写一个死锁?相关推荐
- java的死锁是什么意思_Java面试题:什么是死锁?如何手写一个死锁(Dead Lock)...
要想实现一个死锁,首先要明白什么是死锁,我们看一下死锁的定义: 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称 ...
- java 死锁种类_用java写一个死锁
什么是死锁? 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 不适当的使用"synchronized"关键词来管理 ...
- Unity 突发奇想做的一个UI边缘光效果
mask贴图是用SD做的,所以也没啥参考价值,看着玩玩吧 我的评价是不如AE做序列帧,但是shader写比较方便调效果
- JAVA 80行代码 写一个 万年历
今天突发奇想,写一个1899年12月31日到2021年的万年历(花了我半小时) /* *我是小白 */ //欢迎大佬来点评 //我想问各位大佬57-83行的日期输出怎末优化,有没有神魔好的建议 pac ...
- 突发奇想:flash+.Net+数据库的一种构思
大家好!我是冯波!一个刚刚学了点编程的小伙子,爱好比较广泛.除了像其它男生那样喜欢踢足球,打篮球以外,自己也非常喜欢军事.什么<孙子兵法与三十六计>啊,<三国演义>啊总是百看不 ...
- python制作u盘病毒_十行代码--用Python写一个USB病毒!
大家好,我又回来了. 昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun ...
- shell学习之突发奇想 ^_^ 打印9*9乘法表
国庆放假到今天,<linux命令行和高级shell编程>初步学习到了第十章.基本上一些简单的流程控制脚本我可以编写出来.今天偶然突发奇想,想把 9*9的乘法表打出来.思考了半天,终于有了结 ...
- 用Python写一个纪念日计算工具
用python写一个纪念日计算工具 前言 主要内容 日期计算函数 GUI布局 用pyinstaller打包生成.exe文件 打包后的.exe文件预览 运行结果 最后提前祝马英俊生日快乐吧~ 前言 纪念 ...
- 用python写一个纪念日计算工具!有对象的特别注意了!
前言 纪念日计算工具 是在了解GUI的规程中,突发奇想写的一个小东西,用到的是Python的 tkinter 控件.本人非开发人员,渣渣数据分析师,如遇大佬请轻喷,如有代码错误或不规范,感谢指正. 主 ...
- 写一个简单的准星辅助小工具
由于平时喜欢玩射击游戏,人又很菜,于是突发奇想做个显示准星一直显示在屏幕中间的小程序. 思路:创建透明窗口,在窗口中间画准星.允许点击窗口后面的内容 准星窗口: 1.设置窗口属性,画出中间准星 < ...
最新文章
- VO 1 先弄明白在干什么
- asyncio之Coroutines,Tasks and Future
- AfxParseURL
- Lync2013 升级错误总结8 Lync2013 日志总是提示进程 RtcHost(5724) 收到了一个无效的客户端证书...
- 学习ubuntu 网址
- KDD China技术峰会回顾:大牛云集,教你如何基于大数据 手握人工智能未来
- jQuery lightbox插件(相册全屏效果)
- Unity协程(Coroutine)之yield和迭代原理分析
- android gridview textview,gogo体育官方网站-gogo体育官方网站
- Python tkinter(GUI编程)模块最完整讲解(上)
- 记录spring编译过程遇到的问题previously initiated loading for a different type with name kotlin/sequences/Seque
- Centos8 部署Promethus(普罗米修斯)+grafana画图
- 小程序为什么要办理ICP增值电信业务经营许可证
- 基于CodeMirrorTernJS的汉语Javascript编辑器(和翻译器)
- 智慧物联下主机加固如何理解?
- VB.NET的form窗体操作
- PCIe扫盲——PCIe错误报告机制
- Matlab实现经典功率谱分析和估计
- C语言——星号三角形
- Go Web之Gin框架 启动程序之后程序直接停止的问题解决