刚把手头上的项目代码撸完,闲来看看博客,然后就看到了线程这块的东西。之前有简单的记录过线程和进行的零碎知识。
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.如我们所愿,死锁发生了!

突发奇想-怎么写一个死锁?相关推荐

  1. java的死锁是什么意思_Java面试题:什么是死锁?如何手写一个死锁(Dead Lock)...

    要想实现一个死锁,首先要明白什么是死锁,我们看一下死锁的定义: 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称 ...

  2. java 死锁种类_用java写一个死锁

    什么是死锁? 多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 不适当的使用"synchronized"关键词来管理 ...

  3. Unity 突发奇想做的一个UI边缘光效果

    mask贴图是用SD做的,所以也没啥参考价值,看着玩玩吧 我的评价是不如AE做序列帧,但是shader写比较方便调效果

  4. JAVA 80行代码 写一个 万年历

    今天突发奇想,写一个1899年12月31日到2021年的万年历(花了我半小时) /* *我是小白 */ //欢迎大佬来点评 //我想问各位大佬57-83行的日期输出怎末优化,有没有神魔好的建议 pac ...

  5. 突发奇想:flash+.Net+数据库的一种构思

    大家好!我是冯波!一个刚刚学了点编程的小伙子,爱好比较广泛.除了像其它男生那样喜欢踢足球,打篮球以外,自己也非常喜欢军事.什么<孙子兵法与三十六计>啊,<三国演义>啊总是百看不 ...

  6. python制作u盘病毒_十行代码--用Python写一个USB病毒!

    大家好,我又回来了. 昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序.查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun ...

  7. shell学习之突发奇想 ^_^ 打印9*9乘法表

    国庆放假到今天,<linux命令行和高级shell编程>初步学习到了第十章.基本上一些简单的流程控制脚本我可以编写出来.今天偶然突发奇想,想把 9*9的乘法表打出来.思考了半天,终于有了结 ...

  8. 用Python写一个纪念日计算工具

    用python写一个纪念日计算工具 前言 主要内容 日期计算函数 GUI布局 用pyinstaller打包生成.exe文件 打包后的.exe文件预览 运行结果 最后提前祝马英俊生日快乐吧~ 前言 纪念 ...

  9. 用python写一个纪念日计算工具!有对象的特别注意了!

    前言 纪念日计算工具 是在了解GUI的规程中,突发奇想写的一个小东西,用到的是Python的 tkinter 控件.本人非开发人员,渣渣数据分析师,如遇大佬请轻喷,如有代码错误或不规范,感谢指正. 主 ...

  10. 写一个简单的准星辅助小工具

    由于平时喜欢玩射击游戏,人又很菜,于是突发奇想做个显示准星一直显示在屏幕中间的小程序. 思路:创建透明窗口,在窗口中间画准星.允许点击窗口后面的内容 准星窗口: 1.设置窗口属性,画出中间准星 < ...

最新文章

  1. VO 1 先弄明白在干什么
  2. asyncio之Coroutines,Tasks and Future
  3. AfxParseURL
  4. Lync2013 升级错误总结8 Lync2013 日志总是提示进程 RtcHost(5724) 收到了一个无效的客户端证书...
  5. 学习ubuntu 网址
  6. KDD China技术峰会回顾:大牛云集,教你如何基于大数据 手握人工智能未来
  7. jQuery lightbox插件(相册全屏效果)
  8. Unity协程(Coroutine)之yield和迭代原理分析
  9. android gridview textview,gogo体育官方网站-gogo体育官方网站
  10. Python tkinter(GUI编程)模块最完整讲解(上)
  11. 记录spring编译过程遇到的问题previously initiated loading for a different type with name kotlin/sequences/Seque
  12. Centos8 部署Promethus(普罗米修斯)+grafana画图
  13. 小程序为什么要办理ICP增值电信业务经营许可证
  14. 基于CodeMirrorTernJS的汉语Javascript编辑器(和翻译器)
  15. 智慧物联下主机加固如何理解?
  16. VB.NET的form窗体操作
  17. PCIe扫盲——PCIe错误报告机制
  18. Matlab实现经典功率谱分析和估计
  19. C语言——星号三角形
  20. Go Web之Gin框架 启动程序之后程序直接停止的问题解决

热门文章

  1. 设置三个按钮等宽分布
  2. [IT技术]改变计算技术的伟大算法
  3. 我的PDF阅读器之muPDF的编译
  4. 2010年程序员的最后一天!
  5. DB2存储过程分页测试
  6. MSN Messenger去广告和其他修改方法
  7. Ubuntu16.04下安装opencv-3.3.0
  8. Java的GUI学习九(列出指定目录内容)
  9. 1007 Maximum Subsequence Sum(25 分)
  10. A - 敌兵布阵(线段树)(单点更新区间求和)