lock invoke 死锁事例

代码如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Windows.Forms;
  4 using System.Threading;
  5
  6 namespace TestThread
  7 {
  8     public partial class Form3 : Form
  9     {
 10         //死锁
 11         LongLock mCnt = new LongLock();
 12
 13         public Form3()
 14         {
 15             InitializeComponent();
 16
 17             mCnt.mEventChanged += mCnt_mEventChanged;
 18         }
 19
 20         void mCnt_mEventChanged(string arg1, long arg2, bool arg3)
 21         {
 22             this.Invoke(new Action(
 23                 () =>
 24                 {
 25                     this.Text = mCnt.Value.ToString();
 26                     Application.DoEvents();
 27                 }));
 28         }
 29
 30         private void Form3_Load(object sender, EventArgs e)
 31         {
 32
 33         }
 34
 35         private void button1_Click(object sender, EventArgs e)
 36         {
 37             int i = 0;
 38             while (i++ <= 20)
 39             {
 40                 Random random = new Random();
 41                 Thread t = new Thread(new ThreadStart(
 42                     () =>
 43                     {
 44                         Thread.Sleep(random.Next(10, 20));
 45
 46                         mCnt.Plus(Environment.TickCount.ToString());
 47
 48                     }));
 49                 t.Start();
 50                 Thread.Sleep(1);
 51             }//end while
 52         }
 53
 54     }
 55
 56     public class LongLock
 57     {
 58         object _objLock = null;
 59         HashSet<string> _hashSet = null;
 60
 61         public event Action<string, long, bool> mEventChanged;
 62
 63         public LongLock()
 64         {
 65             _hashSet = new HashSet<string>();
 66             _objLock = new object();
 67         }
 68
 69         public int Value
 70         {
 71             get
 72             {
 73                 lock (_objLock)
 74                 {
 75                     return _hashSet.Count;
 76                 }
 77             }
 78         }
 79
 80         public void Plus(string id)
 81         {
 82
 83             lock (_objLock)
 84             {
 85                 if (!_hashSet.Contains(id))
 86                 {
 87
 88                     _hashSet.Add(id);
 89                     Notice(id, _hashSet.Count, true);
 90                 }
 91             }
 92
 93         }
 94
 95         public void Minus(string id)
 96         {
 97             lock (_objLock)
 98             {
 99                 if (_hashSet.Contains(id))
100                 {
101                     _hashSet.Remove(id);
102                     Notice(id, _hashSet.Count, true);
103                 }
104             }
105         }
106
107         void Notice(string id, long value, bool isPlus)
108         {
109             if (mEventChanged != null)
110             {
111                 mEventChanged(id, value, isPlus);
112             }
113         }
114
115
116     }
117
118
119     public class LongLock2
120     {
121         object _objLock = null;
122         HashSet<string> _hashSet = null;
123
124         public event Action<string, long, bool> mEventChanged;
125
126         public LongLock2()
127         {
128             _hashSet = new HashSet<string>();
129             _objLock = new object();
130         }
131
132         public int Value
133         {
134             get
135             {
136                 lock (_objLock)
137                 {
138                     return _hashSet.Count;
139                 }
140             }
141         }
142
143         public void Plus(string id)
144         {
145             bool b = false;
146             long value = -1;
147             lock (_objLock)
148             {
149                 if (!_hashSet.Contains(id))
150                 {
151                     b = true;
152                     _hashSet.Add(id);
153                     value = _hashSet.Count;
154                 }
155             }
156             if (b)
157             {
158                 Notice(id, _hashSet.Count, true);
159             }
160         }
161
162         public void Minus(string id)
163         {
164             bool b = false;
165             long value = -1;
166             lock (_objLock)
167             {
168                 if (_hashSet.Contains(id))
169                 {
170                     b = true;
171                     _hashSet.Remove(id);
172                     value = _hashSet.Count;
173                 }
174             }
175             if (b)
176             {
177                 Notice(id, value, false);
178             }
179         }
180
181         void Notice(string id, long value, bool isPlus)
182         {
183             if (mEventChanged != null)
184             {
185                 mEventChanged(id, value, isPlus);
186             }
187         }
188
189
190     }
191
192
193
194 }
时间: 2024-09-29 21:12:40

lock invoke 死锁事例的相关文章

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

/* 目的:自己写一个由于同步嵌套引起的死锁! 思路:多个线程在执行时,某一时刻,0-Thread绑定了LockA锁,1-Thread绑定了LockB锁! 当0-Thread要去绑定LockB锁时 和 1-Thread要去绑定LockA锁时都不能绑定,此时两个线程不能继续进行! */ class Ticket implements Runnable{ public boolean flag; Ticket(boolean flag){ this.flag = flag; } Ticket(){

互斥锁LOCK()与RLOCK()

资源总是有限的,程序运行如果对同一个对象进行操作,则有可能造成资源竞争,也可能导致读写混乱,此时需要引入锁. 锁提供如下方法: 1.Lock.acquire([blocking])    # 上锁2.Lock.release()      # 解锁3.threading.Lock()      # 加载线程的锁对象,是一个基本的锁对象,一次只能一个锁定,其余锁请求,需等待锁释放后才能获取 4.threading.RLock() 多重锁,在同一线程中可用被多次acquire.如果使用RLock,那

【转】编程词汇

很实用的编程英语词库,共收录一千五百余条词汇. 第一部分: application 应用程式 应用.应用程序 application framework 应用程式框架.应用框架 应用程序框架 architecture 架构.系统架构 体系结构 argument 引数(传给函式的值).叁见 parameter 叁数.实质叁数.实叁.自变量 array 阵列 数组 arrow operator arrow(箭头)运算子 箭头操作符 assembly 装配件 assembly language 组合语

C#中的多线程 - 同步基础

原文:http://www.albahari.com/threading/part2.aspx 1同步概要 在第 1 部分:基础知识中,我们描述了如何在线程上启动任务.配置线程以及双向传递数据.同时也说明了局部变量对于线程来说是私有的,以及引用是如何在线程之间共享,允许其通过公共字段进行通信. 下一步是同步(synchronization):为期望的结果协调线程的行为.当多个线程访问同一个数据时,同步尤其重要,但是这是一件非常容易搞砸的事情. 同步构造可以分为以下四类: 简单的阻塞方法 这些方法

编程词汇

application 应用程式 应用.应用程序 application framework 应用程式框架.应用框架 应用程序框架 architecture 架构.系统架构 体系结构 argument 引数(传给函式的值).叁见 parameter 叁数.实质叁数.实叁.自变量 array 阵列 数组 arrow operator arrow(箭头)运算子 箭头操作符 assembly 装配件 assembly language 组合语言 汇编语言 assert(ion) 断言 assign 指

编程序常用英语单词

application 应用程式 应用.应用程序 application framework 应用程式框架.应用框架 应用程序框架 architecture 架构.系统架构 体系结构 argument 引数(传给函式的值).叁见 parameter 叁数.实质叁数.实叁.自变量 array 阵列 数组 arrow operator arrow(箭头)运算子 箭头操作符 assembly 装配件 assembly language 组合语言 汇编语言 assert(ion) 断言 assign 指

程序员必须掌握的600个英语单词

application 应用程式 应用.应用程序 application framework 应用程式框架.应用框架 应用程序框架 architecture 架构.系统架构 体系结构 argument 引数(传给函式的值).叁见 parameter 叁数.实质叁数.实叁.自变量 array 阵列 数组 arrow operator arrow(箭头)运算子 箭头操作符 assembly 装配件 assembly language 组合语言 汇编语言 assert(ion) 断言 assign 指

C#中的多线程 - 同步基础 z

原文:http://www.albahari.com/threading/part2.aspx 专题:C#中的多线程 1同步概要Permalink 在第 1 部分:基础知识中,我们描述了如何在线程上启动任务.配置线程以及双向传递数据.同时也说明了局部变量对于线程来说是私有的,以及引用是如何在线程之间共享,允许其通过公共字段进行通信. 下一步是同步(synchronization):为期望的结果协调线程的行为.当多个线程访问同一个数据时,同步尤其重要,但是这是一件非常容易搞砸的事情. 同步构造可以

编程常用英语词汇大全

很实用的编程英语词库,共收录一千五百余条词汇. 第一部分: application 应用程式 应用.应用程序 application framework 应用程式框架.应用框架 应用程序框架 architecture 架构.系统架构 体系结构 argument 引数(传给函式的值).叁见 parameter 叁数.实质叁数.实叁.自变量 array 阵列 数组 arrow operator arrow(箭头)运算子 箭头操作符 assembly 装配件 assembly language 组合语