C# 多线程Synchronization和ContextBoundObject应用

C#处理多线程可以说是方式多种多样,多到你都不知道选择那个好,直到Task的出现,Task类的灵活机制和极为优美的写法让所有.net开发者眼前一亮,但是今天我们要说一说一个冷门的多线程安全处理机制,Synchronization属性和ContextBoundObject类,这两个一起使用可以让一个类的实例处于上下文的线程安全中,注意不需要写一大堆lock,只需要在类上有Synchronization这个属性和继承ContextBoundObject,没错就是这么简单这么优雅,让我们一起欣赏一下我的简易Demo源码。

(我们不深入讨论上下文机制既然用C#让我们先知其然而不知所以然吧这或许是C#语言的初衷


using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Contexts;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication2
{

    class Program
    {
        [Synchronization(true)]
        class Test : ContextBoundObject
        {
            public  int count = 0;

            public void Display()
            {
                count++;
                Console.WriteLine("ContextID:{1},统计:{0}", count, Thread.CurrentContext.ContextID);
            }
        }

        static void Main(string[] args)
        {
            Test test = new Test();
            Thread thread1 = new Thread(new ThreadStart(() =>
            {
                for (int i = 0; i < 50; i++)
                {
                    test.Display();
                }
            }));

            Thread thread2 = new Thread(new ThreadStart(() =>
            {
                for (int i = 0; i < 50; i++)
                {
                    test.Display();
                }
            }));

            thread1.Start();
            thread2.Start();
            while (true)
            {


            }
        }
    }
}

大家试试这段代码就知道,加不加Synchronization属性和ContextBoundObject类是会直接得到两种不同结果的,一个是线程安全的一个是线程不安全的。(不用谢请叫我雷锋 偷笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值