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

看下面的例子:

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. powerdesigner 连接 Oracle ,并将表结构导入到powerdesigner中

    powerdesigner 详细很多人都用过,很多人可能也有用来连接各种数据库以及从数据库中把表结构更新到powerdesigner的model中,或者将自己设计的表结构应用到数据库中.那么我今天就说 ...

  2. Literal绑定数据

    前台: <asp:Literal ID = "ChiCunShow" runat = "server"></asp:Literal> 后 ...

  3. ELK学习笔记之kibana关闭和进程查找

    启动kibana : nohup ./kibana & 查看启动日志 : tail -f nohup kibana  使用  ps -ef|grep kibana 是查不到进程的,主要原因大概 ...

  4. opencv学习之路(34)、SIFT特征匹配(二)

    一.特征匹配简介 二.暴力匹配 1.nth_element筛选 #include "opencv2/opencv.hpp" #include <opencv2/nonfree ...

  5. android开发_ViewGroup(组视图)-- 五大布局

    view组--ViewGroup(组视图) ViewGroup的作用:在view中添加子控件.ViewGroup的5个子类,就是五大布局: (1) LinearLayout  线性布局(常用) (2) ...

  6. 复旦大学2017--2018学年第二学期(17级)高等代数II期末考试第六大题解答

    六.(本题10分)   设 $A$ 为 $n$ 阶幂零阵 (即存在正整数 $k$, 使得 $A^k=0$), 证明: $e^A$ 与 $I_n+A$ 相似. 证明  由 $A$ 是幂零阵可知, $A$ ...

  7. (js) 字符串和数组的常用方法

    JS中字符串和数组的常用方法 JS中字符串和数组的常用方法 js中字符串常用方法 查找字符串 根据索引值查找字符串的值 根据字符值查找索引值 截取字符串的方法 字符串替换 字符串的遍历查找 字符串转化 ...

  8. PHP工程师必备知识整理

    一.http/https协议,tcp/ip协议,websocket,session,cookie 二.php:oop,thinkphp5,laravel 三.mysql.memcache.redis ...

  9. error LNK1169 找到一个或多个多重定义的符号的解决方法

    问题描述如下: 有 三个源文件,A.h.B.cpp.C.cpp. A.h是头文件,其中声明了三个变量a1.a2. a3. B.cpp是A.h中所声明的类的实现源代码,C.cpp是主程序文件.B.cpp ...

  10. mysql分库 分页查询

    Mysql海量数据分表分库如何列表分页? 1.现在使用ElasticSearch了.基于Lucene的解决方案 2.必须将mysql里的数据写入到类似hbase这样的分布式数据库,查询快.但分页.查询 ...