死锁

什么是死锁:
是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁

死锁产生的四个条件
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

案例:

import sun.security.krb5.internal.TGSRep;

public class Test14 implements Runnable {
    public int flag=1;
    static Object o1=new Object(), o2=new Object();

    public static void main(String[] args) {
        Test14 td1=new Test14();
        Test14 td2=new Test14();
        td1.flag=1;
        td2.flag=0;
        Thread t1=new Thread(td1);
        t1.setName("线程一");
        Thread t2=new Thread(td2);
        t2.setName("线程二");
        t1.start();
        t2.start();

    }

    @Override
    public void run() {
        System.out.println("falg"+flag);
        if(flag==1){
            synchronized (o1) {

                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {

                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"在执行操作");
                synchronized (o2) {
                    System.out.println("1");
                }

            }

        }

        if(flag==0){
            synchronized (o2) {

                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {

                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"在执行操作");
                synchronized (o1) {
                    System.out.println("0");
                }

            }

        }

    }

}
时间: 2024-09-20 12:01:52

死锁的相关文章

解决sqlite死锁示例异常database is locked

/* * sqlite的连接方式实际上为单连接方式,即使实用多线程也是用的一个连接 * getWritableDatabase()和getReadableDatabase()都为synchronized方法,但不是static方法 * 所以都只对同一个对象起同步作用,对于不同的对象没有任何作用 * 所以使用sqlite的时候可以提供一个单一的入口,防止多对象修改数据库而造成死锁 * 所以可以提供一个static的instance对象+它的get方法, * 连接可一直挂着,即使多次调用getWri

一个线上死锁问题分析

死锁日志如下: TRANSACTION 48AA4BB9, ACTIVE 0 sec inserting mysql tables in use 1, locked 1 LOCK WAIT 6 lock struct(s), heap size 1248, 4 row lock(s), undo log entries 2 MySQL thread id 1409173, OS thread handle 0x5659f940, query id 1084083936 10.246.138.19

runnable-线程一直处于RUNNABLE,也没有发现阻塞或是死锁的情况?

问题描述 线程一直处于RUNNABLE,也没有发现阻塞或是死锁的情况? 我写的是一个频繁访问网络的爬虫,启了20个线程: 但是老实跑了一段时间,线程全部处于RUNNABLE状态了: 网络使用的是httpclient3.1; 我把threaddump给放到下面: "Thread-19" #30 prio=5 os_prio=0 tid=0x0000000059b3d000 nid=0xcb4 runnable [0x000000005ba1e000] java.lang.Thread.S

在SQL Server 2005中解决死锁

server|解决 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁. use Northwind begin tran     insert into Orders(CustomerId) values('ALFKI')     waitfor delay '00:00:05'     select * from Ord

SQL Server 死锁处理和优化心得

前段时间提到的"sql server 2005 死锁解决探索",死锁严重,平均每天会发生一次死锁,在解决和处理SQL server2005死锁中查了很多资料和想了很多办法, 对为何出现死锁和怎样较少死锁有了进一步认识,在这里和大家一起分享:           sql server 锁类型    在数据库中主要存在两种锁: S(共享锁)和X(排他锁)       S(共享锁):在执行查询数据时,sql server会将行锁定,这时只能查询数据,删,改被阻塞,       X(排他锁):

启动SQLServer的死锁检查

server|sqlserver 对于数据库死锁,通常可以通过TRACE FLAG 1204.1205.1206,检查ERRORLOG里面的输出,和分析SQLTRACE的执行上下文判断死锁问题的来由.TRACEON函数的第三个参数设置为-1,表示不单单针对当前connection,而是针对所有包括未来建立的connection.这样,才够完全,否则只是监视当前已经建立的数据库连接了.   执行下面的话可以把死锁记录到Errorlog中: dbcc traceon (1204, 3605, -1)

探讨由于死锁或进程阻塞造成的ASP突然不能访问的问题

很多次了,每当我在dc9.cn上安装上计数系统或者反向链接系统就会出现这种情况.现象是自己的空间突然间不能访问,仔细观察是只有ASP不能访问而静态页面却可以访问,FTP访问也正常,看上去好像是IIS假死. 询问:   首先我致电通联无限的客服,他们态度很好,说有可能是进程阻塞造成的服务器不能访问.果然他们帮我回收一下服务器资源就能访问了. 研究:   到底是什么造成了我的服务器突然死锁或进程阻塞呢?我研究了很久,最终得出的结论是:由于统计系统的访问量过大,同时查询更新数据库的人数太多,而造成了A

使用 TRY/CATCH 语句解决 SQL Server 2005 死锁

本文示例源代码或素材下载 对于今天的 RDBMS 体系结构而言,死锁难以避免 - 在高容量的 OLTP 环境中更是极为普遍.正是由于 .NET 的公共语言运行库 (CLR) 的出现,SQL Server 2005 才得以为开发人员提供一种新的错误处理方法.在本月专栏中,Ron Talmage 为您介绍如何使用 TRY/CATCH 语句来解决一个死锁问题. 一个示例死锁 让我们从这样一个示例开始说起,它在 SQL Server 2000 和 2005 中都能引起死锁.在本文中,我使用 SQL Se

如何防止插入删除表造成的数据库死锁

在数据库中经常会遇到这样的情况:一个主表A,一个子表B,B表中包含有A表的主键作为外键.当要插入数据的时候,我们会先插入A表,然后获得A表的Identity,再插入B表.如果要进行删除操作,那么就先删除子表B,然后再删除主表A.在程序设计中,对两个表的操作是在一个事务之中完成的. 当系统使用频繁就会出现插入操作和删除操作同时进行的情况.这个时候插入事务会先将主表A放置独占锁,然后去访问子表B,而同时删除事务会对子表B放置独占锁,然后去访问主表A.插入事务会一直独占着A表,等待访问B表,删除事务也

有趣的多线程编程(4)——死锁

编程|多线程 // DeadLockSample.cs// 分析一下为什么会发生死锁? using System;using System.Threading;public class Test{ static readonly object firstLock = new object(); static readonly object secondLock = new object(); static void Main() { new Thread(new ThreadStart(Thre