Java死锁举例
死锁:
在多线程竞争使用共享资源的情况下。就有可能出现死锁的情况。比方,当一个线程等待还有一个线程所持有的锁时。那个线程又可能在等待第一个线程所持有的锁。此时。这两个线程会陷入无休止的相互等待状态。这样的情况就称为死锁。
产生死锁的四个必要条件:
1、相互排斥条件。
进程对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占有。
2、请求和保持条件。当进程因请求资源而堵塞时,对已获得的资源保持不放。
3、不剥夺条件。
进程已获得的资源,在未使用完之前。不能被剥夺。仅仅能在使用完时由自己释放。
4、环路等待条件。
在发生死锁时,必定存在一个进程-资源的环形链。即进程集合{P1,P2,。。。
,Pn}中的P1等待一个P2占用的资源,P2正在等待一个P3占用的资源。。
。
。,Pn正在等待已被P1所占用的资源。
比較简单的解决死锁的方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个。来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。可是因为所施加的限制条件往往太严格。可能会导致系统资源利用率和系统吞吐量减少。
以下是产生死锁的一个演示样例:
- package com.hh.deadLock;
- public class DeadLockDemo {
- public static void main(String[] args) {
- final Object resource1 = "资源1";
- final Object resource2 = "资源2";
- Thread t1 = new Thread(){
- public void run() {
- synchronized(resource1){
- System.out.println("线程1:获取资源1使用权");
- try {
- Thread.sleep(500);
- } catch (Exception e) { }
- synchronized(resource2){
- System.out.println("线程1:等待资源2");
- }
- }
- }
- };
- Thread t2 = new Thread(){
- public void run() {
- synchronized(resource2){
- System.out.println("线程2:获取资源2使用权");
- try {
- Thread.sleep(500);
- } catch (Exception e) { }
- synchronized(resource1){
- System.out.println("线程2:等待资源1");
- }
- }
- }
- };
- t1.start();
- t2.start();
- }
- }
程序会先打印出
- 线程1:获取资源1使用权
- 线程2:获取资源2使用权
或者是
- 线程2:获取资源2使用权
- 线程1:获取资源1使用权
然后程序就不再往下运行
线程t1获取“资源1”使用权后等待“资源2”。而线程t2获取“资源2”使用权后等待“资源1”。这样,线程t1和线程t2就引起了死锁。
假设将程序中的Thread.sleep(500);这行代码凝视,则程序可能引起死锁,也可能不引起。
Java死锁举例的更多相关文章
- 简单java死锁设计002
/** * 死锁举例 * @author lenovo * */ public class DeadlockTest { private static Object obj1 = new Object ...
- Java死锁排查和Java CPU 100% 排查的步骤整理
================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...
- 面试题-Java设计模式举例
面试题-Java设计模式举例 1.适配器模式 涉及三个角色:Target目标接口.Adaptee源角色.Adapter适配器:Adapter将源接口适配到目标接口,继承源接口,实现目标接口. Java ...
- 一文学会Java死锁和CPU 100% 问题的排查技巧
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...
- Java死锁演示
Java死锁演示 在线程中嵌套获取锁导致死锁.思路,尽量不要嵌套获取锁. package com.mozq.demo.demo; public class DeadLockDemo { private ...
- 【性能优化】一文学会Java死锁和CPU100%问题的排查技巧
原文链接: 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过: 第一个问题:Java死锁如何排查和解决? 第二个问题:服 ...
- java 死锁演示
java 死锁演示 java死锁 模拟死锁生成 死锁是由多个线程竞争同一个资源导致 package com.feshfans; /** * 1. 本代码为展示 java 中死锁的产生 * 2. 死锁的 ...
- 实例详解 Java 死锁与破解死锁
锁和被保护资源之间的关系 我们把一段需要互斥执行的代码称为临界区.线程在进入临界区之前,首先尝试加锁 lock(),如果成功,则进入临界区,此时我们称这个线程持有锁:否则呢就等待,直到持有锁的线程解锁 ...
- Java 死锁以及如何避免?
Java 中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java 死锁情况 出现至少两个线程和两个或更多资源. Java 发生死锁的根本原因是:在申请锁时发生了交叉闭环申请.
随机推荐
- windows 10 的开始菜单里面图标右击弹不出选项菜单了
组策略的问题 win + r => gpedit.msc 计算机配置->管理模板>“开始”菜单和任务栏>在“开始”菜单中禁用上下文菜单 改为“已禁用”
- destoon 部署到服务器如何修改密码使网站能正常访问登录
1.根目录的config.inc.php 修改 db_pass 2.缓存文件 根目录/file/cache/module-2.php 修改 uc_dbpwd PS:不一定都在module-2.p ...
- PTA L2-004 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集
L2-004 这是二叉搜索树吗? (25 分) 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结 ...
- 114. Flatten Binary Tree to Linked List【Medium】【将给定的二叉树转化为“只有右孩子节点”的链表(树)】
Given a binary tree, flatten it to a linked list in-place. For example, given the following tree: 1 ...
- msysgit: Unicode font warning
Warning:your console font probably does not support unicode , if you experience strange characters ...
- Bzoj3837 [Pa2013]Filary(随机化)
题面 权限题 题解 这题有一个很好的性质,就是一定有$k>\frac n2$.接着考虑怎么做. 我们随机选取一个数$x$,然后将所有数与它作差,那么只需要找出$k$个差值使得他们的最大公因数大于 ...
- Bzoj 2286 & Luogu P2495 消耗战(LCA+虚树+欧拉序)
题面 洛谷 Bzoj 题解 很容易想到$O(nk)$的树形$dp$吧,设$f[i]$表示处理完这$i$颗子树的最小花费,同时再设一个$mi[i]$表示$i$到根节点$1$路径上的距离最小值.于是有: ...
- 洛谷——P1629 邮递员送信
P1629 邮递员送信 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要 ...
- 第7天-javascript内置对象
数组相关方法 concat 用来连接多个数组 <script> var a = [1,2,3]; var b = [3,4,5]; var c = a.concat(b); console ...
- poj 3225 Help with Intervals(线段树,区间更新)
Help with Intervals Time Limit: 6000MS Memory Limit: 131072K Total Submissions: 12474 Accepted: ...