例1、不用线程锁的情况下,两个线程对同一个变量进行加减操作

static void Main(string[] args)
{
Counter counter = new Counter();
var t1 = new Thread(() => TestCounter(counter));
var t2 = new Thread(() => TestCounter(counter));
t1.Start();
t2.Start(); Thread.Sleep(TimeSpan.FromSeconds());//睡眠3秒,保证t1、t2两个线程都运行完毕
Console.WriteLine(counter.count);
Console.Read();
}

  对count变量不断地加1减1,最后count应该为0,但可以看出用两个线程来进行这个操作的时候,往往得到的结果并不是0,出现错误。

例2、使用线程锁,两个线程对同一个变量进行加减操作

static void Main(string[] args)
{
CounterWithLock counterlock = new CounterWithLock();
var t1 = new Thread(() => TestCounter(counterlock));
var t2 = new Thread(() => TestCounter(counterlock));
t1.Start();
t2.Start(); Thread.Sleep(TimeSpan.FromSeconds());//睡眠3秒,保证t1、t2两个线程都运行完毕
Console.WriteLine(counterlock.count);
Console.Read();
}

  加上线程锁后,结果正常,因此加上线程锁才能保证不会出错。

例1、例2所用到的类和方法

/// <summary>
/// 对同一个变量进行1000次加减操作
/// </summary>
/// <param name="c"></param>
static void TestCounter(CounterBase c)
{
Console.WriteLine("TestCounter start");
for (int i = ; i < ; i++)
{
c.Increment();
c.Decrement();
}
Console.WriteLine("TestCounter end");
}
abstract class CounterBase
{
public abstract void Increment();
public abstract void Decrement();
} /// <summary>
/// 没有锁
/// </summary>
class Counter : CounterBase
{
public int count { get; private set; } public override void Increment()
{
count ++;
} public override void Decrement()
{
count --;
}
} /// <summary>
/// 加锁
/// </summary>
class CounterWithLock : CounterBase
{
private readonly object locker = new object();
public int count { get; private set; } public override void Increment()
{
lock (locker)
{
count++;
}
} public override void Decrement()
{
lock (locker)
{
count--;
}
}
}

最新文章

  1. 小丁带你走进git的世界二-工作区暂存区分支
  2. 【Java并发系列01】Thread及ThreadGroup杂谈
  3. python split函数
  4. Vue2父子组件通信探究
  5. dotnet run是如何启动asp.net core站点的
  6. MySQL中concat函数
  7. Spring MVC中使用Interceptor拦截器
  8. C#高级功能(四)扩展方法和索引
  9. AngularJS自定义指令(Directives)在IE8下的一个坑
  10. Dom操作高级应用
  11. Bootstrap 禁用滚动条
  12. Unix 文件系统读写时权限校验
  13. Charles手机抓包实用教程
  14. 【工具篇】Sublime Text 2 安装汉化破解、插件包安装教程详解
  15. day20_雷神_django第三天
  16. linux(fedora) 第二课
  17. 【转】背后的故事之 - 快乐的Lambda表达式(一)
  18. Visual Studio 2010 出现关于ActivityLog.xml错误的解决方案
  19. POJ1236或洛谷2746或洛谷2812 Network of Schools
  20. 题解 P5239 【回忆京都】

热门文章

  1. Deep Learning 32: 自己写的keras的一个callbacks函数,解决keras中不能在每个epoch实时显示学习速率learning rate的问题
  2. EventStore文件存储设计
  3. UVA11613 Acme Corporation —— 最小费用流(流量不固定的最小费用流)
  4. RegistryView
  5. fullcalendar小结
  6. docker容器安装使用
  7. Tomcat 系统架构与设计模式之一
  8. poj-1273 Drainage Ditches(最大流基础题)
  9. Ntrip通讯协议1.0
  10. 201响应为什么进了AJAX error回调函数