C# 线程同步与线程异步

1.线程同步:
研究对象: 来自Thread类的构造器委托参数
1.1 没有参数且无返回值的委托,代码实例:
Thread threadStart=new Thread(new ThreadStart(
()=>
{
for(var i=0;i<1000000;i++)
{
Console.WriteLine(“后台线程计数”+i);
}
}));
threadStart.IsBackground=true;
threadStart.Start();
1.2带有参数但无返回值的委托,代码实例:
Thread parametThreadStart=new Thread(new ParameterizedThreadStart((object obj)=>
{
for(var i=0;i<(int)obj;i++)
{
Console.WriteLine(“后台线程计数”+i);
Thread.Sleep(100);
}
}));
parametThreadStart.IsBackground=true;
parametThreadStart.Start(1000);
2.线程异步:(对于有参数又有返回值的委托,用new Thread()就不行了改用异步就可以实现)
研究对象:有参数又有返回值的委托,代码实例:
public delegate string MethodCaller(string name);
public static void Main(string[] args)
{
MethodCaller mc = new MethodCaller(GetName);
string name = “zhangsan”;
IAsyncResult result = mc.BeginInvoke(name, null, null);//异步
string myname = mc.EndInvoke(result);//接收返回值
Console.WriteLine(myname);
}
public static string GetName(string name)
{
return name;
}
3.多线程资源共享带来的数据紊乱问题:(解决办法)
方法:采用.NET悲观锁lock的方式
实例代码:
BookShop book = new BookShop();
Thread parametThreadStart1 = new Thread(book.Sale);
Thread parametThreadStart2 = new Thread(book.Sale);
parametThreadStart1.Start();
parametThreadStart2.Start();

  class BookShop
    {
        public int num = 1;
        private static readonly object oLock = new object();
        public void Sale()//参数:剩余图书数量
        {
            lock (oLock)
            {
                int tmp = num;
                if (tmp > 0)
                {
                    Thread.Sleep(1000);
                    num -= 1;
                    Console.WriteLine("售出一本书,还剩余{0}本", num);
                }
                else
                {
                    Console.WriteLine("没有了");
                }
            }
        }
    }
    代码运行结果:(分两种)
    a.带lock
    售出一本书,还剩余0本
    没有了
    b.不带lock
     售出一本书,还剩余0本
     售出一本书,还剩余-1本
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值