1. 什么情况下使用lock,到底lock了什么
首先lock是一个不推荐使用的东西。因为性能低。但是如果遇到多个线程需要使用同一个资源,如果不会更改这些资源,那么没有必要用锁。
只有在涉及到多线程会更改同一个公共资源,才需要。只是读取没有必要加锁。
lock 了什么?
lock(objectA){codeB} 看似简单,实际上有三个意思,这对于适当地使用它至关重要:
1. objectA被lock了吗?没有则由我来lock,否则一直等待,直至objectA被释放。
2. lock以后在执行codeB的期间其他线程不能调用codeB,也不能使用objectA。
3. 执行完codeB之后释放objectA,并且codeB可以被其他线程访问。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using SevenZip;
using zlib;
namespace ConsoleApp1
{
public class lockDemo
{
public object o = new object();
static Dictionary<string, string> dic = new Dictionary<string, string>();
public void NonCriticalSection(object aa)
{
lock (o)
{
dic["1"] = aa.ToString();
Thread.Sleep(1000);
}
}
public void Consoles()
{
lock (dic)
{
for (int i=1;i<20;i++)
{
Thread.Sleep(500);
System.Console.WriteLine("Consoles" + dic["1"]);
}
}
}
public static void Main(string[] args)
{
lockDemo e = new lockDemo();
Thread nt1 = new Thread(new ParameterizedThreadStart(e.NonCriticalSection));
nt1.Start("aa");
Thread nt2 = new Thread(new ParameterizedThreadStart(e.NonCriticalSection));
nt2.Start("bb");
Thread nt4 = new Thread(new ParameterizedThreadStart(e.NonCriticalSection));
nt4.Start("cc");
Thread nt3 = new Thread(e.Consoles);
nt3.Start();
Console.ReadLine();
}
}
}