lock 的目的:

不想在自己使用的时候别人也使用这段代码。体现在多线程情况下,只允许当前线程执行该代码区域,其他线程等待直到该线程执行结束;这样可以多线程避免同时使用某一方法造成数据混乱。

一般定义如下:

private static readonly object obj = new object();
lock(obj)
{
'''代码块
}

用法

当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待。但当不同的线程都需要访问某个资源的时候,就需要同步机制了。也就是说当对同一个资源进行读写的时候,我们要使该资源在同一时刻只能被一个线程操作,以确保每个操作都是有效即时的,也即保证其操作的原子性。
lock是C#中最常用的同步方式,格式为lock(objectA){codeB} 。

lock(objectA){codeB} 看似简单,实际上有三个意思,这对于适当地使用它至关重要:

  • objectA被lock了吗?没有则由我来lock,否则一直等待,直至objectA被释放。
  • lock以后在执行codeB的期间其他线程不能调用codeB,也不能使用objectA。
  • 执行完codeB之后释放objectA,并且codeB可以被其他线程访问。

实例代码

在这里插入图片描述

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace Lockdemo
{
    class Program
    {
        private static readonly Object LockObj = new object();
        static int num = 10;
        static void Main(string[] args)
        {
            CreatMT(1);
            CreatMT(2);

            Console.ReadKey();
        }
        /// <summary>
        /// 创建多线程
        /// </summary>

        static void CreatMT(int threadNo)
        {
            new Thread(() => Dolock(threadNo)).Start();
            Thread.Sleep(10);
        }
        /// <summary>
        /// 执行加锁
        /// </summary>
        /// <param name="whichone"></param>
        static void Dolock(int whichone)
        {
            ShowMessage("等待锁资源", whichone);
            lock (LockObj)
            {
                Dosomething(whichone);
            }
            ShowMessage("释放锁", whichone);
        }
        /// <summary>
        /// 要锁的方法
        /// </summary>
        /// <param name="whichone"></param>
        static void Dosomething(int whichone)
        {
            ShowMessage("进入锁并开始操作", whichone);
            for (int i = 0; i < 5; i++)
            {
                Thread.Sleep(1000);
                Console.WriteLine($"第{whichone}个线程执行:{--num}");
            }
            ShowMessage($"{whichone} 操作完成,完成时间为" + DateTime.Now, whichone);
        }

        static void ShowMessage(string message, int which)
        {
            Console.WriteLine(String.Format("第{0}个线程 {1}", which, message));
        }
    }


}

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐