加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

[C#.NET][Thread] 小心使用线程的锁定对象

发布时间:2020-12-16 01:24:23 所属栏目:百科 来源:网络整理
导读:[C#.NET][Thread] 小心使用线程的锁定对象 假设我对一个耗时的工作使用了ThreadPool,当我实例化多个执行个体时,不同的执行个体都要能各自工作。 public class DemoClass{ private static object s_lock = new object(); private ulong m_value = 0; public

[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] 小心使用线程的锁定对象

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读