zoukankan      html  css  js  c++  java
  • Lock 深入理解

    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(); } } }


  • 相关阅读:
    postgres 输出数据集的自定义函数
    python 验证码识别初探
    python 位运算【实测】
    postgresql 安装插件
    pyasn1 安装异常
    K&R C Note
    如何安全地删除固态硬盘(SSD)、U盘等闪存设备上的文件使其无法恢复?
    C语言枚举类型的使用及其优越性
    算法设计之简易模拟推特(数据结构的综合练习)
    UML笔记之类图
  • 原文地址:https://www.cnblogs.com/xuedognqing/p/12124507.html
Copyright © 2011-2022 走看看