C#编程,资源加锁Lock避免多线程时同时操作同一变量造成数据错误的简单用法。
lock 的目的:不想在自己使用的时候别人也使用这段代码。体现在多线程情况下,只允许当前线程执行该代码区域,其他线程等待直到该线程执行结束;这样可以多线程避免同时使用某一方法造成数据混乱。一般定义如下:private static readonly object obj = new object();lock(obj){'''代码块}用法当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同
·
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));
}
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献20条内容
所有评论(0)