[C#.NET][Thread] 小心使用线程的锁定对象
Posted petewell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[C#.NET][Thread] 小心使用线程的锁定对象相关的知识,希望对你有一定的参考价值。
[C#.NET][Thread] 小心使用线程的锁定对象
假设我对一个耗时的工作使用了ThreadPool,当我实例化多个执行个体时,不同的执行个体都要能各自工作。
public class DemoClass
private static object s_lock = new object();
private ulong m_value = 0;
public void DoWork(string name)
ThreadPool.QueueUserWorkItem(o =>
lock (s_lock)
for (ulong i = 0; i < 1000000; i++)
m_value = i;
Console.WriteLine(string.Format("0 method value = 1", name, m_value));
Thread.Sleep(1000);
);
实例化类
internal class Program
private static void Main(string[] args)
DemoClass c1 = new DemoClass();
DemoClass c2 = new DemoClass();
c1.DoWork("NO.1");
Thread.Sleep(1000);
c2.DoWork("NO.2");
Console.ReadKey();
上段程序的执行结果如下:
使用静态变量锁定的结果,让不同的执行个体都参考了同一个锁定对象,这带来了一个问题,每当程序员使用这个类,调用非静态方法时,都会遇到这个锁,都会同步,这就失去了我们的目的
- 要完成非静态方法在多线程下,能在不同的执行个体能各自工作,只要将 s_lock 的 static 拿掉就好了。
- 静态方法要确保线程安全,则用静态的对象来锁定,若DoWork是静态方法,s_lock 就不需要改变。
将 s_lock 的 static 拿掉的执行结果
若有谬误,烦请告知,新手发帖请多包涵
2010~2017 C# 第四季
原文:大专栏 [C#.NET][Thread] 小心使用线程的锁定对象
以上是关于[C#.NET][Thread] 小心使用线程的锁定对象的主要内容,如果未能解决你的问题,请参考以下文章