死锁:

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

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

1、相互排斥条件。

进程对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占有。

2、请求和保持条件。当进程因请求资源而堵塞时,对已获得的资源保持不放。

3、不剥夺条件。

进程已获得的资源,在未使用完之前。不能被剥夺。仅仅能在使用完时由自己释放。

4、环路等待条件。

在发生死锁时,必定存在一个进程-资源的环形链。即进程集合{P1,P2,。。。

,Pn}中的P1等待一个P2占用的资源,P2正在等待一个P3占用的资源。。

。,Pn正在等待已被P1所占用的资源。

比較简单的解决死锁的方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个。来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。可是因为所施加的限制条件往往太严格。可能会导致系统资源利用率和系统吞吐量减少。

以下是产生死锁的一个演示样例:

  1. package com.hh.deadLock;
  2.  
  3. public class DeadLockDemo {
  4.  
  5. public static void main(String[] args) {
  6. final Object resource1 = "资源1";
  7. final Object resource2 = "资源2";
  8. Thread t1 = new Thread(){
  9. public void run() {
  10. synchronized(resource1){
  11. System.out.println("线程1:获取资源1使用权");
  12. try {
  13. Thread.sleep(500);
  14. } catch (Exception e) { }
  15. synchronized(resource2){
  16. System.out.println("线程1:等待资源2");
  17. }
  18. }
  19. }
  20. };
  21. Thread t2 = new Thread(){
  22. public void run() {
  23. synchronized(resource2){
  24. System.out.println("线程2:获取资源2使用权");
  25. try {
  26. Thread.sleep(500);
  27. } catch (Exception e) { }
  28. synchronized(resource1){
  29. System.out.println("线程2:等待资源1");
  30. }
  31. }
  32. }
  33. };
  34.  
  35. t1.start();
  36. t2.start();
  37. }
  38. }

程序会先打印出

  1. 线程1:获取资源1使用权
  2. 线程2:获取资源2使用权

或者是

  1. 线程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. windows 10 的开始菜单里面图标右击弹不出选项菜单了

    组策略的问题 win + r => gpedit.msc 计算机配置->管理模板>“开始”菜单和任务栏>在“开始”菜单中禁用上下文菜单  改为“已禁用”

  2. destoon 部署到服务器如何修改密码使网站能正常访问登录

    1.根目录的config.inc.php  修改 db_pass 2.缓存文件 根目录/file/cache/module-2.php   修改 uc_dbpwd PS:不一定都在module-2.p ...

  3. PTA L2-004 这是二叉搜索树吗?-判断是否是对一棵二叉搜索树或其镜像进行前序遍历的结果 团体程序设计天梯赛-练习集

    L2-004 这是二叉搜索树吗? (25 分)   一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结 ...

  4. 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 ...

  5. msysgit: Unicode font warning

    Warning:your console font probably does not support unicode , if you experience  strange characters ...

  6. Bzoj3837 [Pa2013]Filary(随机化)

    题面 权限题 题解 这题有一个很好的性质,就是一定有$k>\frac n2$.接着考虑怎么做. 我们随机选取一个数$x$,然后将所有数与它作差,那么只需要找出$k$个差值使得他们的最大公因数大于 ...

  7. Bzoj 2286 & Luogu P2495 消耗战(LCA+虚树+欧拉序)

    题面 洛谷 Bzoj 题解 很容易想到$O(nk)$的树形$dp$吧,设$f[i]$表示处理完这$i$颗子树的最小花费,同时再设一个$mi[i]$表示$i$到根节点$1$路径上的距离最小值.于是有: ...

  8. 洛谷——P1629 邮递员送信

    P1629 邮递员送信 题目描述 有一个邮递员要送东西,邮局在节点1.他总共要送N-1样东西,其目的地分别是2~N.由于这个城市的交通比较繁忙,因此所有的道路都是单行的,共有M条道路,通过每条道路需要 ...

  9. 第7天-javascript内置对象

    数组相关方法 concat 用来连接多个数组 <script> var a = [1,2,3]; var b = [3,4,5]; var c = a.concat(b); console ...

  10. poj 3225 Help with Intervals(线段树,区间更新)

    Help with Intervals Time Limit: 6000MS   Memory Limit: 131072K Total Submissions: 12474   Accepted:  ...