C# 线程锁Lock 死锁

使用lock场景

  • 多线程环境中,不使用lock锁,会形成竞争条件,导致错误。
  • 使用lock 锁 可以保证当有线程操作某个共享资源时,其他线程必须等待直到当前线程完成操作。
    即是多线程环境,如果一个线程锁定了共享资源,需要访问该资源的其他线程则会处于阻塞状态,并等待直到该共享资源接触锁定。
using System;
using System.Threading;

namespace testthread_keyword_lock
{
    class Program
    {
        static void Main(string[] args)
        {
           //不使用lock锁
            Console.WriteLine("incorrect counter");
            var c = new Counter();
            var t1 = new Thread(() => testCounter(c));
            var t2 = new Thread(() => testCounter(c));
            var t3 = new Thread(() => testCounter(c));
            t1.Start();
            t2.Start();
            t3.Start();
            t1.Join();
            t2.Join();
            t3.Join();

            Console.WriteLine("Total count:{0}", c.Count);
            Console.WriteLine("------------------------");
            Console.WriteLine("correct counter");
            var c1 = new CountWithLock();
            t1 = new Thread(()=>testCounter(c1));
            t2 = new Thread(() => testCounter(c1));
            t3 = new Thread(() => testCounter(c1));
            t1.Start();
            t2.Start();
            t3.Start();
            t1.Join();
            t2.Join();
            t3.Join();
            Console.WriteLine("Total count:{0}", c1.Count);

        }
        static void testCounter(CounterBase c)
        {
            for (int i = 0; i < 100; i++)
            {
                c.Increment();
                c.Decrement();
            }

        }
    }
    //定义抽象类
    abstract class CounterBase
    {
        public abstract void Increment();
        public abstract void Decrement();
    }
    //继承 抽象类
    class Counter : CounterBase
    {
        public int Count { get; private set; }
        //实现抽象方法
        public override void Increment()
        {
            Count++;
        }
        public override void Decrement()
        {
            Count--;
        }


    }
    //lock锁
    class CountWithLock : CounterBase
    {
        private readonly object _syncRoot = new object();
        public int Count { get; private set; }
        //实现抽象方法
        public override void Increment()
        {
            lock (_syncRoot)
            {
                Count++;
            }
        }
        public override void Decrement()
        {
            lock (_syncRoot)
            {
                Count--;
            }
        }
    }
 }

结果
998935-20160727142153013-1209281010.png

死锁

  • 使用lock时注意共享资源使用,不然可能造成deadlock
  • 使用monitor类 其拥有TryEnter方法,该方法接收一个超时参数。如果我们能够在获取被lock保护的资源之前,超时参数过期。则该方法会返回false

转载于:https://www.cnblogs.com/ch-lf/p/5710966.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值