代码如下:

 using System;
 using System.Collections.Generic;
 using System.Windows.Forms;
 using System.Threading;

 namespace TestThread
 {
     public partial class Form3 : Form
     {
         //死锁
         LongLock mCnt = new LongLock();

         public Form3()
         {
             InitializeComponent();

             mCnt.mEventChanged += mCnt_mEventChanged;
         }

         void mCnt_mEventChanged(string arg1, long arg2, bool arg3)
         {
             this.Invoke(new Action(
                 () =>
                 {
                     this.Text = mCnt.Value.ToString();
                     Application.DoEvents();
                 }));
         }

         private void Form3_Load(object sender, EventArgs e)
         {

         }

         private void button1_Click(object sender, EventArgs e)
         {
             ;
             )
             {
                 Random random = new Random();
                 Thread t = new Thread(new ThreadStart(
                     () =>
                     {
                         Thread.Sleep(random.Next(, ));

                         mCnt.Plus(Environment.TickCount.ToString());

                     }));
                 t.Start();
                 Thread.Sleep();
             }//end while
         }

     }

     public class LongLock
     {
         object _objLock = null;
         HashSet<string> _hashSet = null;

         public event Action<string, long, bool> mEventChanged;

         public LongLock()
         {
             _hashSet = new HashSet<string>();
             _objLock = new object();
         }

         public int Value
         {
             get
             {
                 lock (_objLock)
                 {
                     return _hashSet.Count;
                 }
             }
         }

         public void Plus(string id)
         {

             lock (_objLock)
             {
                 if (!_hashSet.Contains(id))
                 {

                     _hashSet.Add(id);
                     Notice(id, _hashSet.Count, true);
                 }
             }

         }

         public void Minus(string id)
         {
             lock (_objLock)
             {
                 if (_hashSet.Contains(id))
                 {
                     _hashSet.Remove(id);
                     Notice(id, _hashSet.Count, true);
                 }
             }
         }

         void Notice(string id, long value, bool isPlus)
         {
             if (mEventChanged != null)
             {
                 mEventChanged(id, value, isPlus);
             }
         }

     }

     public class LongLock2
     {
         object _objLock = null;
         HashSet<string> _hashSet = null;

         public event Action<string, long, bool> mEventChanged;

         public LongLock2()
         {
             _hashSet = new HashSet<string>();
             _objLock = new object();
         }

         public int Value
         {
             get
             {
                 lock (_objLock)
                 {
                     return _hashSet.Count;
                 }
             }
         }

         public void Plus(string id)
         {
             bool b = false;
             ;
             lock (_objLock)
             {
                 if (!_hashSet.Contains(id))
                 {
                     b = true;
                     _hashSet.Add(id);
                     value = _hashSet.Count;
                 }
             }
             if (b)
             {
                 Notice(id, _hashSet.Count, true);
             }
         }

         public void Minus(string id)
         {
             bool b = false;
             ;
             lock (_objLock)
             {
                 if (_hashSet.Contains(id))
                 {
                     b = true;
                     _hashSet.Remove(id);
                     value = _hashSet.Count;
                 }
             }
             if (b)
             {
                 Notice(id, value, false);
             }
         }

         void Notice(string id, long value, bool isPlus)
         {
             if (mEventChanged != null)
             {
                 mEventChanged(id, value, isPlus);
             }
         }

     }

 }

lock invoke 死锁事例的更多相关文章

  1. Gimbal Lock欧拉角死锁问题

    技术背景 在前面几篇跟SETTLE约束算法相关的文章(1, 2, 3)中,都涉及到了大量的向量旋转的问题--通过一个旋转矩阵,给定三个空间上的欧拉角\(\alpha, \beta, \gamma\), ...

  2. C# Winform 界面线程的Invoke死锁,以及Application.DoEvent的问题

    1.对于非界面线程来说,Invoke是把一个操作丢到界面线程的队列里,然后阻塞,等到这个操作被界面线程完成后,才继续后续操作.也就是说,Invoke是同步的. 问题来了,如果界面线程此时正在等待这个非 ...

  3. 并发、并行、同步、异步、全局解释锁GIL、同步锁Lock、死锁、递归锁、同步对象/条件、信号量、队列、生产者消费者、多进程模块、进程的调用、Process类、

    并发:是指系统具有处理多个任务/动作的能力. 并行:是指系统具有同时处理多个任务/动作的能力. 并行是并发的子集. 同步:当进程执行到一个IO(等待外部数据)的时候. 异步:当进程执行到一个IO不等到 ...

  4. java中同步嵌套引起的死锁事例代码

    /* 目的:自己写一个由于同步嵌套引起的死锁! 思路:多个线程在执行时,某一时刻,0-Thread绑定了LockA锁,1-Thread绑定了LockB锁! 当0-Thread要去绑定LockB锁时 和 ...

  5. C# lock 死锁问题排查方法

    多线程程序发生死锁,某些重要线程卡住,不正常工作.排查起来非常麻烦.以下内容记录排查方法 1.确定死锁的位置,一般死锁会lock到某一行具体的代码,比如我就死锁在类似如下代码中 public void ...

  6. Java线程之如何分析死锁及避免死锁

    什么是死锁 java中的死锁是一种编程情况,其中两个或多个线程被永久阻塞,Java死锁情况出现至少两个线程和两个或更多资源. 在这里,我们将写了一个简单的程序,它将导致java死锁场景,然后我们将分析 ...

  7. 一个 Linux 上分析死锁的简单方法

    简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这 ...

  8. Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures

    参考博客: https://www.cnblogs.com/xiao987334176/p/9046028.html 线程简述 什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线 ...

  9. python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...

随机推荐

  1. 获取 metadata 过程详解 - 每天5分钟玩转 OpenStack(167)

    接上节,启动 neutron router 后 instance c1 终于拿到了 metadata, 从下面 c1 的启动日志可知: c1 所认为的 metadata 服务地址是 169.254.1 ...

  2. java学习笔记 --- 条件,循环语句

    一.三元运算符 A:格式    比较表达式?表达式1:表达式2;   B:执行流程:    首先计算比较表达式的值,看是true还是false.    如果是true,表达式1就是结果.    如果是 ...

  3. Hibernate的映射文件中基于主键的双向1对1的关联

    1.Hibernate中采用基于主键的映射策略是,有一端(任意一端)的主键生成策略要是foreign,根据对方的主键来生成自己的主键,它的实体不能拥有自己的主键生成策略,如我的配置文件: <?x ...

  4. 较简单的用ajax修改和添加功能(链接数据库)

    修改和添加关于数据库的信息,可以用于任何的添加和修改 这些数据库和前面的随笔数据库是一样的 一.显示出数据库中的信息 (1)显示的效果也可以是用bootstrap的标签页显示(前面一定要引入boots ...

  5. CentOS6.5下安装oracle11gR2

    安装前须知 内存(RAM)的最小要求是 1GB,建议 2GB 及以上. 虚拟内存 swap 建议:内存为 1GB~2GB 时建议swap大小为内存大小的 1.5 倍:内存为 2GB~16GB 时建议s ...

  6. 【笔记】归纳js getcomputedStyle, currentStyle 以及其相关用法

      好吧,鉴于前端则个行业知识宽度广而深,早期看过高程介绍过的获取元素计算后的最终样式(浏览器显示的最终样式)的方法现在也忘得七七八八了 于是百度了一下,看了一下大神张鑫旭的博客,这里写个随笔记录一下 ...

  7. 老李分享:robotium常用API 1

    老李分享:robotium常用API   robotium常用API Robotium中最重要的类Solo类:其中提供了模拟用户活动的点击.搜索.拖拽等方法. 英文api(经常断开连接打不开):htt ...

  8. 老李教你性能测试监控工具nmon

    老李教你性能测试监控工具nmon   loadrunner的某些性能监控器不够强大,这就需要我们利用更好的工具进行监控,在项目中我们会用nmon工具作为辅助性能监控的工具,帮助我们进行性能分析,pop ...

  9. WPF自定义控件(1)——仪表盘设计[1]

    0.小叙闲言 又接手一个新的项目了,再来一次上位机开发.网上有很多控件库,做仪表盘(gauge)的也不少,功能也很强大,但是个人觉得库很臃肿,自己就计划动手来写一个控件库,一是为学习,二是为了项目.下 ...

  10. Oracle to_date函数

    TO_DATE格式(以时间:2007-11-02   13:45:25为例)Year:      yy two digits 两位年                显示值:07yyy three di ...