线程问题----线程争用(加锁)

如果在线程之间共享数据,则可能会出现线程争用的问题

在惠阳等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站设计、网站制作 网站设计制作按需网站开发,公司网站建设,企业网站建设,品牌网站制作,全网营销推广,成都外贸网站建设,惠阳网站建设费用合理。

1,局一个线程争用的例子:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication6
{
    class Program
    {
        static void Main(string[] args)
        {
            SampleTask st = new SampleTask();
            StateObject so = new StateObject();
            //开启20个任务,每个任务循环执行StateObject类的ChangeState方法
            for (int i = 0; i < 20; i++)
            {
                new Task(st.RaceCondition, so).Start();
            }
            Console.WriteLine("运行完成");
            Console.ReadLine();
        }
    }
    //简单的任务类
    class SampleTask
    {
        public void RaceCondition(object o)
        {
            Trace.Assert(o is StateObject, "只能传递StateObject对象");
            StateObject s = o as StateObject;
            int i = 0;
            //单个任务循环执行StateObject类的ChangeState方法
            while (true)
            {
                s.ChangeState(++i);
            }
        }
    }
    //状态类
    //如果state为5,则加1,后面跟着检查state,如果不为6,就出现了争用。
    class StateObject
    {
        int state = 5;
        public void ChangeState(int loop)
        {
            if (state == 5)
            {
                state++;
                //为false说明出现争用,则程序断言(弹出框)
                Trace.Assert(state == 6, "在循环了" + loop.ToString() + "次后出现了争用");
            }
            state = 5;
        }
    }
   
}

 

 线程问题----线程争用(加锁)

 

2,解决办法:

①:使用lock锁定共享的s变量

    //简单的任务类
    class SampleTask
    {
        public void RaceCondition(object o)
        {
            Trace.Assert(o is StateObject, "只能传递StateObject对象");
            StateObject s = o as StateObject;
            
            int i = 0;
            //单个任务循环执行StateObject类的ChangeState方法
            while (true)
            {
                //使用lock锁定共享的s变量
                lock (s)
                {
                    s.ChangeState(++i);
                }
            }
        }
    }

 ②:将共享对象设置为线程安全的对象

    //状态类
    //如果state为5,则加1,后面跟着检查state,如果不为6,就出现了争用。
    class StateObject
    {
        int state = 5;
        public void ChangeState(int loop)
        {
            //将共享对象设置为线程安全的对象
            lock (this)
            {
                if (state == 5)
                {
                    state++;
                    //为false说明出现争用,则程序断言(弹出框)
                    Trace.Assert(state == 6, "在循环了" + loop.ToString() + "次后出现了争用");
                }
                state = 5;
            }
        }
    }

 


文章标题:线程问题----线程争用(加锁)
转载来于:http://csdahua.cn/article/jihpcs.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流