【C#】为什么有可能会被多个线程修改的对象要加线程锁
例1、不用线程锁的情况下,两个线程对同一个变量进行加减操作
static void Main(string[] args)
{
Counter counter = new Counter();
var t1 = new Thread(() => TestCounter(counter));
var t2 = new Thread(() => TestCounter(counter));
t1.Start();
t2.Start(); Thread.Sleep(TimeSpan.FromSeconds());//睡眠3秒,保证t1、t2两个线程都运行完毕
Console.WriteLine(counter.count);
Console.Read();
}

对count变量不断地加1减1,最后count应该为0,但可以看出用两个线程来进行这个操作的时候,往往得到的结果并不是0,出现错误。
例2、使用线程锁,两个线程对同一个变量进行加减操作
static void Main(string[] args)
{
CounterWithLock counterlock = new CounterWithLock();
var t1 = new Thread(() => TestCounter(counterlock));
var t2 = new Thread(() => TestCounter(counterlock));
t1.Start();
t2.Start(); Thread.Sleep(TimeSpan.FromSeconds());//睡眠3秒,保证t1、t2两个线程都运行完毕
Console.WriteLine(counterlock.count);
Console.Read();
}

加上线程锁后,结果正常,因此加上线程锁才能保证不会出错。
例1、例2所用到的类和方法
/// <summary>
/// 对同一个变量进行1000次加减操作
/// </summary>
/// <param name="c"></param>
static void TestCounter(CounterBase c)
{
Console.WriteLine("TestCounter start");
for (int i = ; i < ; i++)
{
c.Increment();
c.Decrement();
}
Console.WriteLine("TestCounter end");
}
abstract class CounterBase
{
public abstract void Increment();
public abstract void Decrement();
} /// <summary>
/// 没有锁
/// </summary>
class Counter : CounterBase
{
public int count { get; private set; } public override void Increment()
{
count ++;
} public override void Decrement()
{
count --;
}
} /// <summary>
/// 加锁
/// </summary>
class CounterWithLock : CounterBase
{
private readonly object locker = new object();
public int count { get; private set; } public override void Increment()
{
lock (locker)
{
count++;
}
} public override void Decrement()
{
lock (locker)
{
count--;
}
}
}
【C#】为什么有可能会被多个线程修改的对象要加线程锁的更多相关文章
- WPF非UI线程中调用App.Current.MainWindow.Dispatcher提示其他线程拥有此对象,无权使用。
大家都知道在WPF中对非UI线程中要处理对UI有关的对象进行操作,一般需要使用委托的方式,代码基本就是下面的写法 App.Current.MainWindow.Dispatcher.Invoke(ne ...
- Python之路-python(paramiko,进程和线程的区别,GIL全局解释器锁,线程)
一.paramiko 二.进程.与线程区别 三.python GIL全局解释器锁 四.线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生 ...
- 浅谈线程池(上):线程池的作用及CLR线程池
原文地址:http://blog.zhaojie.me/2009/07/thread-pool-1-the-goal-and-the-clr-thread-pool.html 线程池是一个重要的概念. ...
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~ 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
看两个例子,一个是在一个进程里设置另外一个进程中控件的属性.另外一个是在一个进程里获取另外一个进程中控件的属性. 第一个例子 最近,在做一个使用线程控制下载文件的小程序(使用进度条控件显示下载进度)时 ...
- C#中的线程(上)-入门 分类: C# 线程 2015-03-09 10:56 53人阅读 评论(0) 收藏
1. 概述与概念 C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行.一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为"主线 ...
- WPF异常“调用线程无法访问此对象,因为另一个线程拥有该对象 ”
WPF中在对界面进行操作的时候,可能会遇到"调用线程无法访问此对象,因为另一个线程拥有该对象"异常,这是因为WPF中只有UI线程才能操作UI元素,非UI线程要访问UI时就会报异常了 ...
- Qt多线程编程总结(一)(所有GUI对象都是线程不安全的)
Qt对线程提供了支持,基本形式有独立于平台的线程类.线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法. 这个文档是提供给那些对多线程编程有丰富的知识和经验的听众的.推荐阅 ...
- Java并发编程实践读书笔记(1)线程安全性和对象的共享
2.线程的安全性 2.1什么是线程安全 在多个线程访问的时候,程序还能"正确",那就是线程安全的. 无状态(可以理解为没有字段的类)的对象一定是线程安全的. 2.2 原子性 典型的 ...
- [JCIP笔记] (三)如何设计一个线程安全的对象
在当我们谈论线程安全时,我们在谈论什么中,我们讨论了怎样通过Java的synchronize机制去避免几个线程同时访问一个变量时发生问题.忧国忧民的Brian Goetz大神在多年的开发过程中,也悟到 ...
随机推荐
- 【转】【录教程必备】推荐几款屏幕录制工具(可录制GIF)
我们经常会遇到一些场景,需要你向别人展示一些操作或是效果——例如告诉别人某某软件的配置步骤啊.刚设计出来网站的动画效果怎么样啊.某某电影里面的一个镜头多么经典啊.打得大快人心的NBA绝杀瞬间是怎么回事 ...
- luogu2398 SUM GCD
题目大意:求sum i(1->n) (sum j(1->n) (gcd(i,j))). 对于每对(i,j)都来一次gcd很慢,但是我们知道,一个约数i在1~n范围内是n/i个数的约数.gc ...
- 简易SQL语句
/*创建 模式 为用户 User1*/ CREATE SCHEMA test authorization User1; CREATE SCHEMA test USER User1; CREATE TA ...
- kafka2
Master-Slave: 读写分离,save复制master的数据.同步复制:保证了强一致性但是会影响高可用性,因为写入的时候要保证slave都写入了才能返回告诉生产者数据写入成功,如果slave过 ...
- java 获取路径
1.利用System.getProperty()函数获取当前路径:System.out.println(System.getProperty("user.dir"));//user ...
- idhttp post 上传或下载时显示进度条(对接idhttp1.OnWork事件)
通过 idhttp 带进度条上传演示一下,下载和上传原理差不多,说明一下下面例子中的的idhttp 是动态创建的 第一步:添加一个StatusBar或者gauge 进度条,这2个都可以.我用的是 st ...
- Bug不能重现的原因分析及其对策
摘 要:本文简要分析了无法重现的Bug的可能产生原因,包括环境不一致.缺少最准确的描述和浏览器的不当设置.针对这些原因,本文给出了相应的对策.通过这些措施,可以重现许多以前认为不可重现的Bug. ...
- lovelygallery_popup(卡哇依相册)
/*************************** 相册 ***************************/LovelyGallery 功能特点:超过200个令人惊叹的3D&2D硬 ...
- Perl解析JSON数据精解
简介:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - Dece ...
- bzoj1911 [Apio2010]特别行动队——斜率优化DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1911 相当明显的斜率优化,很好做: 注意slp里面要有(double),以免出现精度问题. ...