登录社区
博客
直播
聚能聊
团队号
专家
小程序
NEW
更多
问答
下载
订阅
专题
商城
开发者社区
|
云生态
阿里云头条
博客
问答
聚能聊
直播
下载
论坛
云栖大会
开发者社区
登录社区
注册账号
C#多线程学习笔记(三)
精简版
0
0
0
云栖社区
>
博客
>
正文
C#多线程学习笔记(三)
天地弦
2006-11-22 21:33:00
浏览681
线程
random
lock
c#
static
多线程
class
void
thread
account
展开阅读全文
刚刚把前两天的笔记整理完了,发现做笔记可以加深印象。要坚持做下去,可以学到一些细节的东西。
a.今天学到一个非常试用的lock
语法:
lock(expression) statement_block
expression代表你希望跟踪的对象,通常是对象引用。一般地,如果你想保护一个类的实例,你可以使用this;如果你希望保护一个静态变量(如互斥代码段在一个静态方法内部),一般使用类名就可以了。而statement_block就是互斥段的代码,这段代码在一个时刻内只可能被一个线程执行。
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Threading;
namespace
LockThread
{
internal
class
Account
{
int
balance;
Random r
=
new
Random();
internal
Account(
int
_initial)
{
balance
=
_initial;
}
internal
int
Withdraw(
int
_amount)
{
if
(balance
<
0
)
{
//
如果balance<0则抛出异常
throw
new
Exception(
"
Negative Balance
"
);
}
//
下面的代码保证在当前线程修改balance的值完成之前
//
不会有其他线程也执行这段代码来修改balance的值
//
因此,balance的值是不可能小于0的
lock
(
this
)
{
Console.WriteLine(
"
Current Thread:
"
+
Thread.CurrentThread.Name);
//
如果没有lock关键字的保护,那么可能在执行完if的条件判断之后
//
另外一个线程却执行了balance=balance-amount修改了balance的值
//
而这个修改对这个线程是不可见的,所以可能导致这时if的条件已经不成立了
//
但是,这个线程却继续执行balance=balance-amount,所以导致balance可能小于0
if
(balance
>=
_amount)
{
Thread.Sleep(
5
);
balance
=
balance
-
_amount;
return
_amount;
}
else
{
return
0
;
//
处理事务被拒绝
}
}
}
internal
void
DoTransactions()
{
for
(
int
i
=
0
;i
<
100
; i
++
)
Withdraw(r.Next(
-
50
,
100
));
}
}
class
Program
{
static
internal
Thread[] threads
=
new
Thread[
10
];
static
void
Main(
string
[] args)
{
Account acc
=
new
Account(
0
);
for
(
int
i
=
0
; i
<
10
; i
++
)
{
Thread t
=
new
Thread(
new
ThreadStart(acc.DoTransactions));
t.Name
=
i.ToString();
threads[i]
=
t;
}
for
(
int
i
=
0
; i
<
10
; i
++
)
{
threads[i].Start();
}
Console.ReadLine();
}
}
}
b.还有一个Moniter对象是用来监视对象的,
......
Queue oQueue=new Queue();
......
Monitor.Enter(oQueue);
......//现在oQueue对象只能被当前线程操纵了
Monitor.Exit(oQueue);//释放锁
上面表示oQueue这个对象只有一个线程可以操纵,只有当Mointor.Exit才可以被其它线程所操纵
本文首发在云栖社区,遵循云栖社区版权声明:本文内容由互联网用户自发贡献,版权归用户作者所有,云栖社区不为本文内容承担相关法律责任。云栖社区已在2020年6月升级到阿里云开发者社区。如果您发现有涉嫌抄袭的内容,请填写
侵权投诉表单
进行举报,一经查实,阿里云开发者社区将协助删除涉嫌侵权内容。
网友评论
登录
后评论
0
/500
评论
相关文章
我的博客目录
长征2号
2017-11-27 14:09:00
浏览1649
分享Silverlight/WPF/Windows Phone一周学习导读(3月1日-3月5日)
技术小牛人
2017-11-10 19:39:00
浏览2047
C#多线程学习笔记(二)
天地弦
2006-11-22 21:28:00
浏览609
Silverlight/Windows8/WPF/WP7/HTML5周学习导读(7月16日-7月22日)
技术小牛人
2017-11-15 18:09:00
浏览1811
Silverlight/Windows8/WPF/WP7/HTML5周学习导读(7月16日-7月22日)
技术小牛人
2017-11-17 18:46:00
浏览1858
周公51CTO博客有价值文章整理
技术小甜
2017-11-16 19:27:00
浏览2084
分享Silverlight/WPF/WindowsPhone/HTML5一周学习导读(5月1日-5月5日)
技术小牛人
2017-11-14 19:30:00
浏览1563
C#多线程学习笔记(四) --Lock and Monitor之二
天地弦
2006-11-24 00:07:00
浏览707
Silverlight/Windows8/WPF/WP7/HTML5周学习导读(7月23日-7月29日)
技术小牛人
2017-11-17 18:07:00
浏览1672
C#设计模式学习笔记-单例模式
阿笨net
2012-03-13 15:29:00
浏览616
C#可扩展编程之MEF学习笔记(三):导出类的方法和属性
雲霏霏
2014-08-21 17:17:00
浏览733
C#设计模式学习笔记-单例模式
技术mix呢
2017-10-11 19:47:00
浏览916
C#学习笔记——TCP通讯
zting科技
2017-01-18 18:39:00
浏览765
Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月5日-8月12日)
技术小牛人
2017-11-22 18:04:00
浏览1429
分享Silverlight/Windows8/WPF/WP7/HTML5一周学习导读(5月21日-5月26日)
技术小牛人
2017-11-24 19:06:00
浏览1737
[开发笔记]-多线程
技术小牛人
2017-11-15 20:15:00
浏览722
阅读《LEARNING HARD C#学习笔记》知识点总结与摘要系列文章索引
技术小牛人
2017-11-08 19:06:00
浏览969
阅读《LEARNING HARD C#学习笔记》知识点总结与摘要五
技术小牛人
2017-11-15 19:06:00
浏览947
最近在转C#
天地弦
2006-11-22 21:18:00
浏览527
C#多线程学习笔记(一)
天地弦
2006-11-22 21:06:00
浏览463
下拉加载更多
作者介绍
天地弦
+ 关注
239
文章数
5
粉丝数
0
关注的人
下一篇
【云栖号直播】本周重磅:2020阿里云弹性计算年度发布会
云栖号资讯小编
35098人浏览
本文目录
网友评论