多线程, 当使用共有变量时, 保持计算结果正确很重要:

看下面的例子:

private static int count = ;
//private static object objlock = new object(); public static void Main(string[] args)
{
try
{
for (int i = ; i < ; i++)
{
Thread t1 = new Thread(new ThreadStart(WriteNumber));
t1.Name = "Name-" + i.ToString();
t1.Start();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
} Console.ReadLine();
} public static void WriteNumber()
{
//lock (objlock)
//{
count--;
Thread.Sleep();
Console.WriteLine("Name:" + Thread.CurrentThread.Name + " count:" + count.ToString());
//}
}

结果这样,全错了。

加上lock之后, 代码修改为这样

private static int count = ;
private static object objlock = new object(); public static void Main(string[] args)
{
try
{
for (int i = ; i < ; i++)
{
Thread t1 = new Thread(new ThreadStart(WriteNumber));
t1.Name = "Name-" + i.ToString();
t1.Start();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
} Console.ReadLine();
} public static void WriteNumber()
{
lock (objlock)
{
count--;
Thread.Sleep();
Console.WriteLine("Name:" + Thread.CurrentThread.Name + " count:" + count.ToString());
}
}

运行结果是这样:

注意:private static object objlock = new object();  //定义这个变量的位置,

各线程运行先后, 由CPU随机执行, 每次运行都可能看到不同的先后顺序。

C# Thread Lock 笔记的更多相关文章

  1. Boost Thread学习笔记五

    多线程编程中还有一个重要的概念:Thread Local Store(TLS,线程局部存储),在boost中,TLS也被称作TSS,Thread Specific Storage.boost::thr ...

  2. Boost Thread学习笔记四

    barrierbarrier类的接口定义如下:  1 class barrier : private boost::noncopyable   // Exposition only 2 { 3 pub ...

  3. Boost Thread学习笔记三

    下面先对condition_impl进行简要分析.condition_impl在其构造函数中会创建两个Semaphore(信号量):m_gate.m_queue,及一个Mutex(互斥体,跟boost ...

  4. Boost Thread学习笔记二

    除了thread,boost种:boost::mutexboost::try_mutexboost::timed_mutexboost::recursive_mutexboost::recursive ...

  5. Boost Thread学习笔记

    thread自然是boost::thread库的主 角,但thread类的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的编译选项的不同,分别决定使用 W ...

  6. thread学习笔记--BackgroundWorker 类

    背景: 在 WinForms 中,有时要执行耗时的操作,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,或者在该 ...

  7. Java基础知识强化之多线程笔记06:Lock接口 (区别于Synchronized块)

    1. 简介 我们讲到了如何使用关键字synchronized来实现同步访问.本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式 ...

  8. python笔记10-多线程之线程同步(锁lock)

    前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸 ...

  9. C# 多线程学习笔记 - 2

    本文主要针对 GKarch 相关文章留作笔记,仅在原文基础上记录了自己的理解与摘抄部分片段. 遵循原作者的 CC 3.0 协议. 如果想要了解更加详细的文章信息内容,请访问下列地址进行学习. 原文章地 ...

随机推荐

  1. 关于weblogic部署Java项目的包冲突问题

    我们可能会用各种应用服务部署我们的Java应用,比如Tomcat.WAS.weblogic等.Tomcat和WAS可能会比较少遇到一些奇怪的问题,但是用weblogic部署项目则经常遇到一些比如包冲突 ...

  2. oracle 对表的操作

    对日期数据的插入 insert into tabname(datecol) value(sysdate) ;  -- 用date值 insert into tabname(datecol) value ...

  3. SQL 聚集函数(聚组函数)的使用 注意事项

    原文地址 http://hi.baidu.com/sdunus/blog/item/333c1a29305041fe99250aad.html 在介绍GROUP BY 和 HAVING 子句前,我们必 ...

  4. 【题解】Luogu P4198 楼房重建

    原题传送门 根据斜率来建线段树,线段树维护区间最大斜率以及区间内能看见的楼房的数量(不考虑其他地方的原因,两个节点合并时再考虑) 细节见程序 #include <bits/stdc++.h> ...

  5. GMap获取可视范围内四个角的坐标

    原理: 先获取控件的四个顶点,逐一将其转换成经纬度坐标. private void GetBonds() { //左上↖ PointLatLng pLeftTop = map1.FromLocalTo ...

  6. CH 5102Mobile Service题解

    题目: 用动态规划很容易将完成任务量作为dp的阶段,通过指派服务员,从当前i-1个任务转移到i个任务: 我们可以用一个四维数组f[i][x][y][z]来表示在完成当前任务i时,三个机器人分别在x,y ...

  7. 解决 httpclient 下 Address already in use: connect 的错误

    最近做httpclient做转发服务,发现服务器上总是有很多close_wait状态的连接,而且这些连接都不会关闭,最后导致服务器没法建立新的网络连接,从而停止响应. 后来在网上搜索了一下,发现解决的 ...

  8. Java链接MySQL数据库的配置文件

    文件名:db.properties(随便) driver = com.mysql.jdbc.Driver  //MySQL数据库驱动名url = jdbc:mysql://localhost:3306 ...

  9. 根据字符串导入包使用-----importlib

    import importlibo = importlib.import_module("xx.oo")s2 = "Person"the_class = get ...

  10. office 2019 下载地址

    office2019激活密钥 W8W6K-3N7KK-PXB9H-8TD8W-BWTH9    Office2019下载地址: 下载地址 专业增强版(强烈推荐): http://officecdn.m ...