死锁:

在多线程竞争使用共享资源的情况下。就有可能出现死锁的情况。比方,当一个线程等待还有一个线程所持有的锁时。那个线程又可能在等待第一个线程所持有的锁。此时。这两个线程会陷入无休止的相互等待状态。这样的情况就称为死锁。

产生死锁的四个必要条件:

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死锁举例的更多相关文章

  1. 简单java死锁设计002

    /** * 死锁举例 * @author lenovo * */ public class DeadlockTest { private static Object obj1 = new Object ...

  2. Java死锁排查和Java CPU 100% 排查的步骤整理

    ================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...

  3. 面试题-Java设计模式举例

    面试题-Java设计模式举例 1.适配器模式 涉及三个角色:Target目标接口.Adaptee源角色.Adapter适配器:Adapter将源接口适配到目标接口,继承源接口,实现目标接口. Java ...

  4. 一文学会Java死锁和CPU 100% 问题的排查技巧

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开 工欲善其事,必先利其器 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在 ...

  5. Java死锁演示

    Java死锁演示 在线程中嵌套获取锁导致死锁.思路,尽量不要嵌套获取锁. package com.mozq.demo.demo; public class DeadLockDemo { private ...

  6. 【性能优化】一文学会Java死锁和CPU100%问题的排查技巧

    原文链接: 00 本文简介 作为一名搞技术的程序猿或者是攻城狮,想必你应该是对下面这两个问题有所了解,说不定你在实际的工作或者面试就有遇到过: 第一个问题:Java死锁如何排查和解决? 第二个问题:服 ...

  7. java 死锁演示

    java 死锁演示 java死锁 模拟死锁生成 死锁是由多个线程竞争同一个资源导致 package com.feshfans; /** * 1. 本代码为展示 java 中死锁的产生 * 2. 死锁的 ...

  8. 实例详解 Java 死锁与破解死锁

    锁和被保护资源之间的关系 我们把一段需要互斥执行的代码称为临界区.线程在进入临界区之前,首先尝试加锁 lock(),如果成功,则进入临界区,此时我们称这个线程持有锁:否则呢就等待,直到持有锁的线程解锁 ...

  9. Java 死锁以及如何避免?

    Java 中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java 死锁情况 出现至少两个线程和两个或更多资源. Java 发生死锁的根本原因是:在申请锁时发生了交叉闭环申请.

随机推荐

  1. Java数组的十大方法

    Java数组的十大方法 以下是Java Array的前10种方法.他们是来自stackoverflow的投票最多的问题. 0.声明一个数组 String[] aArray = new String[5 ...

  2. 并发系列3-大白话聊聊Java并发面试问题之谈谈你对AQS的理解?【石杉的架构笔记】

  3. Flask实战第57天:UEditor编辑器集成以及配置上传文件到七牛

    相关链接 UEditor:http://ueditor.baidu.com/website/​ 下载地址:http://ueditor.baidu.com/website/download.html# ...

  4. Grunt Gulp Browserify Webpack

    Grunt 是相比后面几个更早的项目,他依赖于各种插件的配置.这是一个很好的解决方案,但是请相信我,你不会想看到一个 300 行的 Gruntfile Gulp 提供了一个不一样的解决方案,而不是依赖 ...

  5. 【数形结合】Erratic Expansion

    [UVa12627]Erratic Expansion 算法入门经典第8章8-12(P245) 题目大意:起初有一个红球,每一次红球会分成三红一蓝,蓝球会分成四蓝(如图顺序),问K时的时候A~B行中有 ...

  6. BZOJ 4059 [Cerc2012]Non-boring sequences(启发式分治)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4059 [题目大意] 一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的 ...

  7. rmq问题:ST表

    存板子.O(nlogn)预处理,O(1)查询.空间O(nlogn). int d[1000006][25]; int mn[1000006]; void rmq_init() { for(int i= ...

  8. 【动态规划】Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister

    预处理每一层最左侧的1的位置,以及最右侧的1的位置. f(i,0)表示第i层,从左侧上来的最小值.f(i,1)表示从右侧上来. 转移方程请看代码. #include<cstdio> #in ...

  9. spring quartz 配置

    quartz简介 各种企业应用几乎都会碰到任务调度的需求,就拿论坛来说:每隔半个小时生成精华文章的RSS文件,每天凌晨统计论坛用户的积分排名,每隔30分钟执行锁定用户解锁任务.任务调度本身涉及到多线程 ...

  10. express结合jade模板渲染HTML

    在线html转jade工具>> 注意:以下是在Windwo环境下 运行: npm install jade 然后你的目录node_modules下将增加jade文件夹 app.js var ...