using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics ;
using System.Threading ; namespace 多线程
{
class 死锁问题
{
public static void Main()
{
//由于竞态问题,我们使用了锁定,但是,锁定代来的是死锁问题,就是一个线程等待别一个线程解锁
//而别一个线程也在等待它解锁好接续操作,结果是无限等待下去,傻了B了
StateObject obj1 = new StateObject() ;
StateObject obj2 = new StateObject() ;
new Thread( new StateThreadExec( obj1 , obj2 ).Method1 ).Start() ;
//先让第一条线程耍会再启动第二条与他抢,最后就死锁了
//过程是这样的,线程1先锁定s1 再锁定s2 ,如果2条线程同时开,第二条线程可以是在第一条锁定了s1后抢进来的,这时第一
//条线程还没锁住s2,正好让第二条抢的锁上了,这时第二条线程接着要锁s1,但是他锁不上,被第一条占了。
//再次切回第一条线程时,他要接着锁s2,他也一样锁不上,被第二条线程锁上了,等的哇
Thread.Sleep( 1000 ) ;
new Thread( new StateThreadExec( obj1 , obj2 ).Method2 ).Start() ;
}
} class StateObject
{
private int state = 5; public void ChangeState(int loop)
{
if (state == 5)
{
state++;
//如果值不是6时,就要执行断言显示
Trace.Assert(state == 6, "结果不为6,出现在" + loop + "次 线程名字:" + Thread.CurrentThread.Name);
} state = 5;
}
} class StateThreadExec
{
StateObject s1 ;
StateObject s2 ; public StateThreadExec( StateObject s1 , StateObject s2 )
{
this.s1 = s1 ;
this.s2 = s2 ;
} public void Method1()
{
for (int i = 0; i < int.MaxValue; i++)
{
lock( s1 )
{
lock( s2 )
{
Console.WriteLine( "方法1在执行第" + i.ToString() + "次" ) ;
s1.ChangeState(0) ;
s2.ChangeState(0) ;
}
}
}
} public void Method2()
{
for (int i = 0; i < int.MaxValue; i++)
{
lock (s2)
{
lock (s1)
{
Console.WriteLine("方法2在执行第" + i.ToString() + "次");
s1.ChangeState(0);
s2.ChangeState(0);
}
}
}
}
}
}
声明: 本文由(孤狼)原创编译,转载请保留链接: C#多线程的死锁演示

C#多线程的死锁演示的更多相关文章

  1. Java死锁演示

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

  2. java 死锁演示

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

  3. 调试多线程 & 查死锁的bug & gcore命令 & gdb对多线程的调试 & gcore & pstack & 调试常用命令

    gdb thread apply all bt 如果你发现有那么几个栈停在 pthread_wait 或者类似调用上,大致就可以得出结论:就是它们几个儿女情长,耽误了整个进程. 注意gdb的版本要高于 ...

  4. Java:多线程<三>死锁、线程间通讯

    死锁: 同步嵌套同步,而且使用的锁不是同一把锁时就可能出现死锁 class Test implements Runnable { private boolean flag; Test(boolean ...

  5. Java多线程和死锁

    一 .多线程: 售票窗口简单实例: public class SaleTicket { public static class Sale implements Runnable{ ; // @Over ...

  6. 【java】多线程同步死锁

    package 多线程; class A{ public synchronized void say(B b){ System.out.println("A说:你把你的本给我,我把我的笔给你 ...

  7. python并发编程之多线程2---(死锁与递归锁,信号量等)

    一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统 ...

  8. python并发编程之多线程2死锁与递归锁,信号量等

    一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 这些永远在互相等待的进程称为死锁进程 如下就是死锁 ...

  9. 多线程、死锁、线程安全、同步方法、代码块、休眠、守护线程、Thread、Runnable(二十三)

    1.多线程的引入 * 1.什么是线程 * 线程是程序执行的一条路径, 一个进程中可以包含多条线程 * 多线程并发执行可以提高程序的效率, 可以同时完成多项工作* 2.多线程的应用场景 * 红蜘蛛同时共 ...

随机推荐

  1. 解读Google分布式锁服务

    解读Google分布式锁服务  背景介绍 在2010年4月,Google的网页索引更新实现了实时更新,在今年的OSDI大会上,Google首次公布了有关这一技术的论文. 在此之前,Google的索引更 ...

  2. eclipse 部分颜色及部分字体设置

    eclipse整体代码的颜色风格可以用插件 eclipse color theme 更改. 但尽管如此,有些颜色仍不是最满意的,还需自己设计. 1. 光标选中字体的颜色,如图 一个openItem被选 ...

  3. Spreadsheets

    很水的一道题,提醒自己要认真,做的头都快晕了.考虑26的特殊情况. D - Spreadsheets Time Limit:10000MS     Memory Limit:65536KB     6 ...

  4. ssh连接Linux自动断开后再也无法连上的问题

    近期公司测试机有点抓狂,情况是这样的:用SSH登录后正常使用,但另外一部电脑也在登录,这时候会发生全部断开的情况,再也无法连接,连IP都PING不通. 今天尝试在/etc/hosts.deny 加入如 ...

  5. .NET C#操作文件系统数据的常用方法总结 part1

    目录导航 1.0开启文件隐藏属性 1.1开启文件夹只读属性 1.2输出子文件夹路径 1.3统计文件数目 1.4批量重命名文件 1.5分割文件 1.6拼接文件 1.7读取用逗号分割的值 1.8读写压缩数 ...

  6. 深入理解GCD ( 二 )

    转自@nixzhu的GitHub主页(译者:Riven.@nixzhu),原文<Grand Central Dispatch In-Depth: Part 2/2> 欢迎来到GCD深入理解 ...

  7. QT5.6 编译SQLServer驱动

    简要说下编译的主要步骤 @1:打开vs2015的命令行编译环境 ‘ @2:进入到cd到源码目录:cd C:\Qt\Qt5.6.0\5.6\Src\qtbase\src\plugins\sqldrive ...

  8. Python函数式编程:内置函数map()使用说明

    一.概述 map操作是函数式编程中的重要技术之一,其作用就是对一个集合中的每个元素做处理,生成一个新的元素,由这些新的元素组成一个新的集合的返回. 所以map操作后,产生的新集合的元素个数和原集合的元 ...

  9. docker学习笔记14:Dockerfile 指令 ENV介绍

    ENV指令用来在镜像构建过程中设置环境变量.我们来看一个Dockerfile的例子: #test FROM ubuntu MAINTAINER hello ENV MYDIR /mydir RUN m ...

  10. 转:Javascript继承机制的设计思想

    我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...