C#多线程的死锁演示
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#多线程的死锁演示的更多相关文章
- Java死锁演示
Java死锁演示 在线程中嵌套获取锁导致死锁.思路,尽量不要嵌套获取锁. package com.mozq.demo.demo; public class DeadLockDemo { private ...
- java 死锁演示
java 死锁演示 java死锁 模拟死锁生成 死锁是由多个线程竞争同一个资源导致 package com.feshfans; /** * 1. 本代码为展示 java 中死锁的产生 * 2. 死锁的 ...
- 调试多线程 & 查死锁的bug & gcore命令 & gdb对多线程的调试 & gcore & pstack & 调试常用命令
gdb thread apply all bt 如果你发现有那么几个栈停在 pthread_wait 或者类似调用上,大致就可以得出结论:就是它们几个儿女情长,耽误了整个进程. 注意gdb的版本要高于 ...
- Java:多线程<三>死锁、线程间通讯
死锁: 同步嵌套同步,而且使用的锁不是同一把锁时就可能出现死锁 class Test implements Runnable { private boolean flag; Test(boolean ...
- Java多线程和死锁
一 .多线程: 售票窗口简单实例: public class SaleTicket { public static class Sale implements Runnable{ ; // @Over ...
- 【java】多线程同步死锁
package 多线程; class A{ public synchronized void say(B b){ System.out.println("A说:你把你的本给我,我把我的笔给你 ...
- python并发编程之多线程2---(死锁与递归锁,信号量等)
一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 它们都将无法推进下去.此时称系统处于死锁状态或系统 ...
- python并发编程之多线程2死锁与递归锁,信号量等
一.死锁现象与递归锁 进程也是有死锁的 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用, 这些永远在互相等待的进程称为死锁进程 如下就是死锁 ...
- 多线程、死锁、线程安全、同步方法、代码块、休眠、守护线程、Thread、Runnable(二十三)
1.多线程的引入 * 1.什么是线程 * 线程是程序执行的一条路径, 一个进程中可以包含多条线程 * 多线程并发执行可以提高程序的效率, 可以同时完成多项工作* 2.多线程的应用场景 * 红蜘蛛同时共 ...
随机推荐
- C中的宏
1. 简单宏定义 简单的宏定义有如下格式: [#define指令(简单的宏)] #define 标识符替换列表 替换列表是一系列的C语言记号,包括标识符.关键字.数.字符常量.字符串字面量.运算符和 ...
- 条码知识之十:EAN-128条码(下)
国际物品编码协会(EAN)和美国统一代码委员会(UCC)将CODE-128码引入EAN/UCC系统,并作如下规定:起始符由一个START A/B/C 加一个辅助字符FNC1构成,以区别普通的CODE- ...
- cocos2dx进阶学习之CCSpriteBatchNode
继承关系 CCSpriteBatchNode -> CCNode, CCTextureProtocol 成员变量 inline CCTextureAtlas* getTextureAtlas(v ...
- [置顶] android网络通讯之HttpClient4不指定参数名发送Post
在HttpClient4之前都是通过List<NameValuePair>键值对的形式来向服务器传递参数 ,在4.0版本中在加入了不指定参数名发送数据的形式,利用StringEntity来 ...
- IOS中Key-Value Coding (KVC)的使用具体解释
kvc.键值编码,是一个非正式的协议.它提供一种机制来间接訪问对象的属性. 直接訪问对象是通过调用訪问器的方法实现,而kvc不须要调用訪问器的设置和获取方法.能够直接訪问对象的属性. 以下介绍一下kv ...
- linux命令--sysctl
sysctl sysctl被用来在执行时配置内核参数.这些参数都存储在/proc/sys/(以键-值对形式存储)中.你可以用sysctl来读和写数据 命令参数 variable 要读的键值的名字 ...
- 【Oracle】ORA-01722:无效数字(控制文件最后一个字段)
原因: 每一行物理数据最后都存在一个换行符. 如果integer或者number类型的字段位于控制文件的最后,最后其实都会有CR/LF的换行符,在用sqlldr导入时会把换行符也算作那个数字的一部分, ...
- USACO Cow Pedigrees 【Dp】
一道经典Dp. 定义dp[i][j] 表示由i个节点,j 层高度的累计方法数 状态转移方程为: 用i个点组成深度最多为j的二叉树的方法树等于组成左子树的方法数 乘于组成右子树的方法数再累计. & ...
- 关于jsonp(~~原理和理解)
JSON和JSONP 与XML相比,JSON是一个轻量级的数据交换格式.JSON对于JavaScript开发人员充满魅力的原因在于JSON本身就是Javascript中的对象. 例如一个ticker对 ...
- 转:一道笔试题-将int型数组强制转换为char*,再求strlen,涉及大小端
写出如下程序运行结果: #include<stdio.h> #include<string.h> int main() { int a[2000]; char *p = (ch ...