死锁

  • 什么是死锁?

    - 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
  • 死锁出现的原因?

    (1) 因为系统资源不足。  如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。
    
    (2) 进程运行推进顺序不合适。 进程运行推进顺序与速度不同,也可能产生死锁。互相等待对放释放彼此所需要的锁。
    
    (3) 资源分配不当等。
  • 死锁产生的条件?

    (1) 互斥条件:  一个资源每次只能被一个进程使用。
    
    (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
    
    (3) 不剥夺条件: 进程已获得的资源,在末使用完之前,不能强行剥夺。
    
    (4) 循环等待条件: 若干进程之间形成一种头尾相接的循环等待资源关系。
    
     这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
  • 死锁的解除与预防:

    - 理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。
    
    - 在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。
    
    - 此外,也要防止进程在处于等待状态的情况下占用资源。 因此,对资源的分配要给予合理的规划。
  • 死锁代码实例


    public class DeadLock {
    public static void main(String[] args) { //创建对象
    Object o1=new Object();
    Object o2=new Object(); //创建线程 两个线程传入了相同的对象
    Thread t1=new Thread(new T1(o1,o2));
    Thread t2=new Thread(new T2(o1,o2)); //启动线程
    t1.start();
    t2.start(); }
    }

//定义第一个线程
class T1 implements Runnable{ //属性
Object o1;
Object o2; //构造方法
T1(Object o1,Object o2){
this.o1=o1;
this.o2=o2;
} // 重写run方法
@Override
public void run() { synchronized (o1){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){ }
}
}
} //定义第二个线程 class T2 implements Runnable{ Object o1;
Object o2; T2(Object o1,Object o2){
this.o1=o1;
this.o2=o2; } // 重写run方法
@Override
public void run() {
synchronized (o2){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1) { }
}
}
}

Day13_73_死锁的更多相关文章

  1. 查看w3wp进程占用的内存及.NET内存泄露,死锁分析

    一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...

  2. Android 死锁和重入锁

    死锁的定义: 1.一般的死锁 一般的死锁是指多个线程的执行必须同时拥有多个资源,由于不同的线程需要的资源被不同的线程占用,最终导致僵持的状态,这就是一般死锁的定义. package com.cxt.t ...

  3. mysql 行级锁的使用以及死锁的预防

    一.前言 mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务.使用mysql锁的时候有时候会出现死锁,要做好死锁的预防. 二.MySQL行级锁 行级锁又分共享锁和排他锁. 共 ...

  4. MySql 死锁时的一种解决办法

    转自:http://blog.csdn.net/mchdba/article/details/38313881 之前也遇到一次,今天又遇到了这个问题,所以这次必须解决,网上找到这篇文章帮了大忙,方便以 ...

  5. Oracle死锁

    当两个或多个用户相互等待锁定的数据时就会发生死锁,这时这些用户被卡在不能继续处理业务,oracle可以自动检测死锁并解决他们,通过回滚一个死锁中的语句,释放锁定的数据,回滚的话会遇到ora-00060 ...

  6. PostgreSQL杀掉死锁的链接

    查到对应的用户的活动连接: select * from pg_stat_activity where username="xxx"; 杀掉死锁的连接: select pg_term ...

  7. Java多线程中的死锁问题

    Java程序基本都要涉及到多线程,而在多线程环境中不可避免的要遇到线程死锁的问题.Java不像数据库那么能够检测到死锁,然后进行处理,Java中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能 ...

  8. Mysql查询语句使用select.. for update导致的数据库死锁分析

    近期有一个业务需求,多台机器需要同时从Mysql一个表里查询数据并做后续业务逻辑,为了防止多台机器同时拿到一样的数据,每台机器需要在获取时锁住获取数据的数据段,保证多台机器不拿到相同的数据. 我们My ...

  9. 第3月第19天 cxx_destruct dispatch_get_main_queue()死锁

    1. http://blog.jobbole.com/65028/ 2. - (void)viewDidLoad { [super viewDidLoad]; NSLog("); dispa ...

随机推荐

  1. Linux-两种磁盘分区方式

    Linux文件设备 要理解Linux,首先要理解Linux文件结构 在Linux操作系统中,几乎所有的设备都位于/dev目录中 名称 作用 位置 SATA接口 电脑硬盘接口 /dev/sd[a-p] ...

  2. Windows开发常用快捷键

    毕业后一直在从事Windows开发工作,掌握些常用的Windows快捷键可以大大的提升工作效率,同时还能秀一波操作.本文记录在工作中常用的Windows快捷键,以及VS常用快捷键.掌握了这些键盘操作, ...

  3. wxWidgets源码分析(3) - 消息映射表

    目录 消息映射表 静态消息映射表 静态消息映射表处理过程 动态消息映射表 动态消息映射表处理过程 消息映射表 消息是GUI程序的核心,所有的操作行为均通过消息传递. 静态消息映射表 使用静态Event ...

  4. 剑指 Offer 58 - I. 翻转单词顺序 + 双指针

    剑指 Offer 58 - I. 翻转单词顺序 Offer_58_1 题目描述 方法一:使用Split函数 package com.walegarrett.offer; /** * @Author W ...

  5. 【Arduino学习笔记03】面包板基础知识

    终端带 这里有一块面包板,它后面的黏贴纸被撕去了.你可以看到很多在底部的平行金属条. 金属条的结构:金属条的顶部有一个小夹子.这些夹子能将一条导线或某个部件的引脚固定在塑料洞上,使它们放置在适当的位置 ...

  6. jdk8的安装与环境搭建

    jdk8的安装与环境搭建 jdk8下载网址:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html ...

  7. 华为OD机试题

    """最长回文字符串问题"""# 说明:方法很多,这个是最简单,也是最容易理解的一个,利用了动态规化.# 先确定回文串的右边界i,然后以右边 ...

  8. 树莓派4刷FreeBSD

    树莓派4可以刷FreeBSD了.需要替换boot文件.​加群获得文件QQ交流群817507910.

  9. Java高并发编程基础三大利器之CountDownLatch

    引言 上一篇文章我们介绍了AQS的信号量Semaphore<Java高并发编程基础三大利器之Semaphore>,接下来应该轮到CountDownLatch了. 什么是CountDownL ...

  10. springboot注解之@Configuration 和 @Bean

    1.包结构 2.主程序类 1 /** 2 * 主程序类 3 * @SpringBootApplication:这是一个springboot应用 4 * 5 * @SpringBootApplicati ...