C#多线程开发:使用lock语句同步多个线程
来源:互联网 发布:mac 解压 编辑:程序博客网 时间:2024/06/03 18:00
在多个线程之间共享数据时,需要考虑线程同步问题,必须确保每次只有一个线程访问和改变共享数据。
C#中使用lock语句可以轻松地设置和解除锁定以期达到每次只有一个线程访问和改变共享数据的目的。
下面是一个多线程访问共享数据的实例,看看在没有进行同步操作的情况下会出现什么样的问题?
可以将示例代码理解成:一个用户分十次从自己的银行账户中取钱。
取钱的逻辑由下面的代码来实现。
当账户中的余额大于等于1000时,就取出1000放进自己的口袋。
因为用户当前的账户中仅剩下1000,所以就算用户取了10次,最终口袋中也应该只有1000。那么实际情况又是怎样的呢?
请看下面的执行结果(结果也可能是1000,2000,...,9000中的一个)。
结果竟然是10000!!!!!!!!
用户从仅有1000余额的账户中取出了10000,实在是一件令人振奋人心的事。
不过对于银行来说,这可不是件什么好事,因为照这样下去,银行的钱迟早会被用户掏空。
为什么会出现这样的结果呢?
这是因为没有对多线程访问共享数据进行同步,10个线程同时进入了取钱的逻辑,所以一共取出了10000。
为了解决这个问题,可以使用lock语句来同步多线程访问共享数据。下面是增加lock语句后的取钱逻辑。
代码中使用lock关键字锁定对象o,当一个线程获得锁定后,其他线程就无法再获得锁定,只有当当前线程解除锁定后,其他对象才可以重新获得锁定,这样一来,就可以保证每次只有一个线程获得锁定进而访问和修改共享数据。
多次执行修改后的示例代码,每次都可以得到以下的正确结果。
lock语句锁定的对象,必须是引用类型。因为锁定值类型只是锁定了一个副本,没什么意义。
完整代码:
阅读全文
0 0
- C#多线程开发:使用lock语句同步多个线程
- C#多线程开发6:使用lock语句同步多个线程
- C#多线程Lock锁定的使用例子(多线程线程同步)
- C#多线程Lock锁定的使用例子(多线程线程同步)
- 基本线程同步: 在Lock中使用多个条件
- 多线程拨号C#版(探讨lock和Monitor线程同步)
- C#多线程中通过lock实现线程同步
- c#线程同步(2)----lock
- 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄
- 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)(转)
- 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(中) (转)
- 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(下) (转)
- 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)
- 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(中)
- 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(下)
- 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(上)
- 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(中)
- 多线程:C#线程同步lock,Monitor,Mutex,同步事件和等待句柄(下)
- 搭载LNMP时遇到的一些小问题及解决办法
- Java错误类型
- “计划式研发”试水纪念
- 解决 maven 项目中加入了 lombok 库后依然报错的问题
- TP5 实现查询数据库返回json数据(返回json数据函数实例)
- C#多线程开发:使用lock语句同步多个线程
- numpy.random.choice
- 原码 补码 反码
- Android 接口返回Json解析
- Android开发之获取缓存大小和清除缓存
- jsp---用标签操作javaBean(动作标签BeanTest.jsp)
- Redis常见问题
- shader中的变量的声明与定义
- 给定一个整数数组,求它的一个最长递增子序列。