精华内容
下载资源
问答
  • (主要是用户登录判断需要更新session)当PHP 处理大数据量操作时 不能及时操作完成 这时候又有访问其他控制器或者异步请求时候会造成session 死锁现象和同事探讨了下 可使用 session_write_close() 解决此问题复制...
  • 死锁是并发中常见问题,在业务逻辑复杂,锁较多时发生死锁饿概率极大。死锁产生主要原因在于线程之间“死等”对方手里锁。 案例: package com.yc.uc.test; class Resouces{ private String lockA; ...

    死锁是并发中常见的问题,在业务逻辑复杂,锁较多时发生死锁饿的概率极大。死锁产生的主要原因在于线程之间“死等”对方手里的锁。
    案例:

    package com.yc.uc.test;
    class Resouces{
        private String lockA;
        private String lockB;
    
        public Resouces(String lockA, String lockB) {
            this.lockA = lockA;
            this.lockB = lockB;
        }
    
        public void test() throws InterruptedException {
            synchronized (lockA){
                System.out.println(Thread.currentThread().getName()+"已经获取"+lockA+"尝试获取"+lockB);
                Thread.sleep(2000);
                synchronized (lockB){
                    System.out.println("两个锁都已获取!");
                }
            }
        }
    
    }
    /**
     * @Author Allen
     * @Date 2021/3/8 10:35 上午
     * @Version 1.0
     */
    public class DeadLockDemo {
    
        public static void main(String[] args) {
            String lock1 = "lock1";
            String lock2 = "lock2";
            new Thread(()->{
                try {
                    new Resouces(lock1,lock2).test();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
    
            new Thread(()->{
                try {
                    new Resouces(lock2,lock1).test();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    
    }
    
    
    运行结果:
    Thread-0已经获取lock1尝试获取lock2
    Thread-1已经获取lock2尝试获取lock1
    //阻塞,并未结束
    
    

    死锁产生以后,线程阻塞,极为隐蔽,在一般情况下较难发现。

    分析方法
    终端指令:jps(java+ps)在终端查看进程号

    (base) mac@lzydeMacBook-Pro /etc % jps
    1744 Launcher
    2144 Jps
    
    //找到可能产生死锁的 全类名
    1745 DeadLockDemo
    
    329 
    559 
    
    

    终端指令:jstack 1745

    (base) mac@lzydeMacBook-Pro /etc % jstack 1745
    2021-03-08 10:57:00
    Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.181-b13 mixed mode):
    
    ......
    
    Java stack information for the threads listed above:
    ===================================================
    "Thread-1":
            at com.yc.uc.test.Resouces.test(DeadLockDemo.java:16)
            - waiting to lock <0x0000000795aa1468> (a java.lang.String)
            - locked <0x0000000795aa14a0> (a java.lang.String)
            at com.yc.uc.test.DeadLockDemo.lambda$main$1(DeadLockDemo.java:42)
            at com.yc.uc.test.DeadLockDemo$$Lambda$2/739498517.run(Unknown Source)
            at java.lang.Thread.run(Thread.java:748)
    "Thread-0":
            at com.yc.uc.test.Resouces.test(DeadLockDemo.java:16)
            - waiting to lock <0x0000000795aa14a0> (a java.lang.String)
            - locked <0x0000000795aa1468> (a java.lang.String)
            at com.yc.uc.test.DeadLockDemo.lambda$main$0(DeadLockDemo.java:34)
            at com.yc.uc.test.DeadLockDemo$$Lambda$1/1552787810.run(Unknown Source)
            at java.lang.Thread.run(Thread.java:748)
    
    Found 1 deadlock.
    
    
    

    可以查看到产生死锁的具体位置和对应的锁

    展开全文
  • 本文实例讲述了Oracle删除死锁进程的方法。分享给大家供大家参考。具体如下: 步骤1:用以下SQL查看进程列表,判断出被锁定的表 代码如下:SELECT dob.OBJECT_NAME Table_Name,lo.SESSION_ID||’, ‘||vss.SERIAL# ...
  • Oracle删除死锁进程的方法。分享给大家供大家参考。具体如下: 步骤1:用以下SQL查看进程列表,判断出被锁定的表 复制代码 代码如下: SELECT dob.OBJECT_NAME Table_Name,lo.SESSION_ID||', '||vss....
    Oracle删除死锁进程的方法。分享给大家供大家参考。具体如下:
    

    步骤1:用以下SQL查看进程列表,判断出被锁定的表

    复制代码 代码如下:
    SELECT dob.OBJECT_NAME Table_Name,lo.SESSION_ID||', '||vss.SERIAL# 删除号,
    lo.locked_mode,lo.SESSION_ID, vss.SERIAL#,vss.action Action,vss.osuser OSUSER, vss.LOGON_TIME,
    vss.process AP_PID, VPS.SPID DB_PID ,vss.*
    From v$locked_object lo, dba_objects dob, v$session vss, V$PROCESS VPS
    Where lo.OBJECT_ID = dob.OBJECT_ID
    and lo.SESSION_ID = vss.SID
    AND VSS.paddr = VPS.addr
    order by 2,3,DOB.object_name

    查找被锁表

    步骤2 删除进程,如之前的“删除号”查找出的结果为“286, 2184”,则运行以下SQL

    复制代码 代码如下:
    ALTER system kill session '286, 2184'

    删除后不会马上生效一般,要过一会。

    更多Java知识学习请访问Java免费学习   Java自学网 http://www.javalearns.com

    关注微信号:javalearns  ,随时随地学Java

    今天看到一个手机也能赚钱的网站,与大家分享(真实可信,已亲身体验):

    http://javalearns.jifenqiang.com/


    展开全文
  • 1.首先我们需要判断是哪个用户锁住了哪张表. 1 2 3 –查询被锁表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type=‘OBJECT’ ...

    1.首先我们需要判断是哪个用户锁住了哪张表.
    1
    2
    3
    –查询被锁表
    select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
    from sys.dm_tran_locks where resource_type=‘OBJECT’
    查询后会返回一个包含spid和tableName列的表.
    其中spid是进程名,tableName是表名.
    2.了解到了究竟是哪个进程锁了哪张表后,需要通过进程找到锁表的主机.
    1
    2
    3
    –查询主机名
    exec sp_who2 ‘xxx’
    xxx就是spid列的进程,检索后会列出很多信息,其中就包含主机名.
    3.通过spid列的值进行关闭进程.
    1
    2
    3
    4
    5
    6
    –关闭进程
    declare @spid int
    Set @spid = xxx --锁表进程
    declare @sql varchar(1000)
    set @sql='kill '+cast(@spid as varchar)
    exec(@sql)
    –关闭进程
    declare @spid int
    Set @spid = xxx --锁表进程
    declare @sql varchar(1000)
    set @sql='kill '+cast(@spid as varchar)
    exec(@sql)
    PS:有些时候强行杀掉进程是比较危险的,所以最好可以找到执行进程的主机,在该机器上关闭进程.

    展开全文
  • 二、避免死锁的方法 2.1 死锁预防(确保不会进入死锁状态) 2.1.1 破坏不可剥夺条件 2.1.2 破坏请求与保持条件 2.1.3 破坏循环等待链条件 2.2 进程使用前判断-------只允许不会产生死锁的进程申请资源 2.2.1 ...

    目录

    一、死锁的四种必要条件

    二、避免死锁的方法

    2.1  死锁预防(确保不会进入死锁状态)

    2.1.1 破坏不可剥夺条件

    2.1.2  破坏请求与保持条件

    2.1.3 破坏循环等待链条件

    2.2  进程使用前判断-------只允许不会产生死锁的进程申请资源

    2.2.1  什么是银行家算法

    2.2.3 银行家算法设计的矩阵

    2.2.4  具体例子


    死锁概念:多个并发进程因争夺系统资源而产生相互等待的现象。

    一、死锁的四种必要条件

    1. 互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。

    2.不可剥夺:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。

    3. 请求与保持:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。(即吃着碗里的,想着别人兜里)

    4. 循环等待链:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。

    当以上四个条件均满足,才会造成死锁,发生死锁的进程无法进行下去,它们所持有的资源也无法释放。这样会导致CPU的吞吐量下降。所以死锁情况是会浪费系统资源和影响计算机的使用性能的。

    二、避免死锁的方法

    2.1  死锁预防(确保不会进入死锁状态)

    产生死锁需要四个条件,那么,只要这四个条件中至少有一个条件得不到满足,就不可能发生死锁了。由于互斥条件是非共享资源所必须的,不仅不能改变,还应加以保证,所以,主要是破坏产生死锁的其他三个条件

    2.1.1 破坏不可剥夺条件

    当一个已经持有了一些资源的进程在提出新的资源请求没有得到满足时,它必须释放已经保持的所有资源,待以后需要使用的时候再申请。这就意味着已经占有的资源会被短暂地释放或者被其他进程抢占。

    缺点:释放已经占有的资源有可能会导致进程之前的工作失效等。

    2.1.2  破坏请求与保持条件

    方法1:在进程开始前,必须一次性地申请其在整个运行过程中所需要的全部资源。

    缺点:因某项资源不满足,而导致进程无法启动,这样的话,其他满足了的资源也不会得到利用,严重降低资源的利用率,造成资源浪费。(因为没手纸,占着茅坑不拉屎)

    方法2:该方法是对第一种方法的改进,允许进程只获得运行初期需要的资源,便开始运行,在运行过程中逐步释放掉分配到的已经使用完毕的资源,然后再去请求新的资源。这样的话,资源利用率会得到提高

    2.1.3 破坏循环等待链条件

    可将每个资源编号,当一个进程占有编号为 i 的资源时,那么它下一次申请的资源只能申请编号大于 i  的资源。如下图:

    缺点:这种方法是比较低效的。因为 资源的执行速度会变慢,具体为 例如 :进程c(拥有资源3的进程)想要申请资源1,如果资源1并没有被其他进程占有,此时将它分配个进程c是没有问题的,但是为了避免产生循环等待,该申请会被拒绝,这样就降低了资源的利用率

     

    2.2  进程使用前判断-------只允许不会产生死锁的进程申请资源

    具体实现通常是银行家算法。

    2.2.1  什么是银行家算法

    银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。

    在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。


    2.2.3 银行家算法设计的矩阵

    为了实现银行家算法,在系统中必须设置这样四个数据结构,分别用来描述  系统中可利用的资源所有进程对资源的最大需求系统中的资源分配以及所有进程还需要多少资源的情况。

    (1) 可利用资源向量 Available。这是一个含有 m 个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果 Available[j] = K,则表示系统中现有j类资源K个。

    (2)最大需求矩阵Max。这是一个n x m的矩阵,它定义了系统中n个进程中的每个进程对m类资源的最大需求。如果Max[i,j] = K,则表示 进程i 需要 j 类资源的最大数目为K。

    (3) 分配矩阵 Allocation。这也是一个n x m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果 Allocation[i,j] = K,则表示  进程i  当前己分得 j类资源的数目为K。

    (4) 需求矩阵Need。这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j] = K,则表示进程i还需要 j类资源K个方能完成其任务。

    上述三个矩阵间存在下述关系:
                  Need[i,j] = Max[i,j] - allocation[i, j] 

     

    2.2.4  具体例子

    安全序列:即 多个进程的执行顺序。只有 Available >=  Need 的序列才是安全序列。

     

    展开全文
  • 死锁的解决方案

    2021-03-29 19:13:02
    预防死锁的方法:资源共享,可剥夺,一次性全部申请,顺序资源分配法 避免死锁的方法:银行家算法 按照一定的序列分配资源,则每个进程都能够顺利完成,这叫做安全序列,只要能够找到一个安全序列那么系统就是安全...
  • 死锁

    千次阅读 2018-08-16 21:01:39
    死锁的最常见情况 相互等待。  业务说明 对于简单的业务,可以规定一次只能锁定一个单元,但对于复杂业务,这种方法不可行。比如:金银互换,1金换10银。分4步:1,判断金币足够。 2,判断银币没到上限 3,金币...
  • 操作系统的死锁

    2016-03-14 17:55:11
    死锁的发生的必要条件有4个,...其中要判断一个系统是否发生死锁,可以先用部分分配的方法按各个进程对资源的申请平均分配资源,如果所有的申请者都没有实现全部分配,表明系统可能形成循环等待,因此可能发生死锁。
  • 实验原理 银行家算法是一种避免死锁的方法,该算法是用来判断系统的安全状态。安全状态是所有进程都能 获得所需最大资源而运行完的状态。判断系统是否安全是通过找进程的安全序列实现,若有安全序列, 系统处于安全...
  • 操作系统7-死锁的检测和解除

    千次阅读 2018-07-23 12:15:29
    允许死锁发生,操作系统不断监视系统进展情况,判断死锁是否发生 一旦死锁发生则采取专门措施,解除死锁并以最小代价恢复操作系统运行 7.1.1 检测时机 定时检测 当进程阻塞时检测死锁(其缺点是系统开销...
  • 银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法死锁的产生,必须同时满足四个条件,即一个资源每次...
  • 死锁和进程通信

    2020-02-11 14:17:57
    判断死锁的四个条件: 一个资源在一个时刻只能给一个进程——互斥 一个进程至少有一个资源且等待其他进程占有的资源——持有并等待 资源只能在进程使用后自愿释放——非抢占 进程i等待进程i+1使用的资源——循环等待...
  • 死锁检测与解除

    2019-05-14 10:08:15
    死锁检测: 允许死锁发生,但是操作系统会不断监视系统进展情况,判断死锁是否真发生 一旦发现有死锁发生则采用专门措施,解除死锁并以最小代价恢复操作系统运行 检测时机: 1、当进程由于资源请求不满足而...
  • 下面我们来介绍解决死锁问题第三类方法 死锁检测与解除 所谓死锁检测呢,是指允许死锁发生 但是操作系统呢 会不断地来监视系统进展情况 通过监视,判断 死锁是否真发生了 那么一旦发现有死锁发生 就会采用...
  • 操作系统-死锁处理

    2020-03-18 22:03:00
    2. 死锁的成因 3. 死锁的4个必要条件 4. 死锁处理方法 1. 死锁预防 2. 死锁避免 判断这次请求是否会引起死锁? 算法实现 死锁避免之银行家算法实例 请求出现时: 首先假装分配,然后调用银行家算法 3. 死锁...
  • 死锁的概念 死锁:由于竞争资源或通信关系,两个或更多进程(线程)在执行过程中出现永远相互等待而引发的事件。死锁对于系统而言是危险的、不安全的,因此在系统的实现时...死锁的判断算法-银行家算法 死锁的恢复方法
  • 死锁检测与恢复

    2020-05-10 13:12:57
    注:本文主要参考自<<现代操作系统>>6.3,6.4节 在死锁一文中,我们提到死锁问题有四种解决方案....需要持续判断当前是否发生了死锁,这是一个不小开销. 死锁检测与恢复 使用这种技术,我们并不试图
  • JAVA线程同步与死锁

    2019-08-27 17:58:32
    同步:所有线程按照顺序一个一个进入到方法中 使用synchronized来处理同步问题 同步方法 同步代码块 synchronized实现原理 synchronized是通过monitor实现 当执行monitorenter时,首先判断该...
  • 最近在做一个有关高铁模拟仓显示系统客户端程序,在这个程序中要运用串口serialPort传输数据,因为每次接收数据结束后要更新UI界面,所以就用到了Invoke,将更新UI程序代码封装到一个方法中,然后通过Incoke...
  • 16.4 Design a class which provides a lock ...有很多方法可以避免死锁的发生,一个常用的方法是列出所需要的锁,然后判断锁上这些锁后会不会发生死锁,比如有如下的锁的顺序: A = {1, 2, 3, 4} B = {1, 3, 5} C...
  • 一、实现多线程两种方式 1、 继承Thread类 2、 实现Runnable接口 ...实现runnable接口:构造函数中传入了Runnable引用,成员变量记住了他,start()调用run()方法时内部判断成员变量Runnable引用是否...
  • linux环境编程-死锁

    2020-10-21 09:04:12
    死锁【线程或者进程由于对锁的竞争让程序处于阻塞...避免死锁的方法: 死锁1:判断lock返回值,如果成功访问完资源后立即解锁。 死锁2:线程1调用trylock函数,尝试着获取锁2,如果失败,说明锁2在别的线程手中,...
  • 操作系统11----死锁

    2019-07-19 08:59:40
    死锁 ...1.2出现死锁的必要条件 2.死锁处理方法 2.1死锁预防:限制申请方式 2.2死锁避免 3.银行家算法(Banker's Algorithm) 3.1数据结构 3.2安全状态判断 3.3银行家算法 4.死锁检测 ...
  • Spark 任务时都是封装为一个 Jar 包,然后采用 Shell 脚本形式传入所需参数执行,考虑到本次判断条件逻辑复杂,只用 Shell 脚本完成不利于开发测试,所以调研使用了 Python 和 Java 分别调用 Spark 脚本的方法。...
  • Linux:死锁避免之系统安全状态

    千次阅读 2018-04-23 21:22:06
    避免死锁的方法中,允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程; 否则,让进程等待。 安全状态 所谓安....

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 293
精华内容 117
关键字:

判断死锁的方法