打开APP
未登录
开通VIP,畅享免费电子书等14项超值服
开通VIP
首页
好书
留言交流
下载APP
联系客服
C#多线程的死锁演示
goodwangLib
>《多线程》
2014.05.03
关注
[c-sharp]
view plain
copy
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);
}
}
}
}
}
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报
。
打开APP,阅读全文并永久保存
查看更多类似文章
猜你喜欢
类似文章
【热】
打开小程序,算一算2024你的财运
多线程的死锁
Java线程的深入探讨
建立vb.net多线程的初步应用
Python:使用threading模块实现多线程编程
Java程序员面试中的多线程问题
Java线程面试题
更多类似文章 >>
生活服务
热点新闻
留言交流
回顶部
联系我们
分享
收藏
点击这里,查看已保存的文章
导长图
关注
一键复制
下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!
联系客服
微信登录中...
请勿关闭此页面
先别划走!
送你5元优惠券,购买VIP限时立减!
5
元
优惠券
优惠券还有
10:00
过期
马上使用
×