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

看下面的例子:

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随机执行, 每次运行都可能看到不同的先后顺序。

最新文章

  1. 每天一个linux命令(49):at命令
  2. Windows Store App 全球化:引用类库资源
  3. avalon2.2.3发布
  4. 如何使用 Migration创建一个迁移
  5. myeclipse中working Sets
  6. agile学习
  7. GPUImage 滤镜头文件
  8. Prefixes and Suffixes
  9. Thanks
  10. sql 根据字段查询不同表
  11. Java实现的高效计数器
  12. NFS文件共享
  13. Nova控制节点集群
  14. xamarin android listview的用法
  15. Office远程代码执行漏洞(CVE-2017-11882)复现
  16. 【Linux】常见基础命令之文件操作
  17. postgresql 日志配置
  18. JVM虚拟机深入理解+GC回收+类加载
  19. JS对象与Dom对象与jQuery对象之间的区别
  20. 【Maven】eclipse中使用Maven、生命周期

热门文章

  1. Git随笔 -- 初始化远程仓库
  2. nginx rewrite (转发)
  3. Vue学习——学习vue必须了解的几个知识点
  4. shell编程(五)之函数
  5. Python各种图像库的图像的基本读写方式
  6. SP913 QTREE2 - Query on a tree II
  7. 前端——BOM和DOM
  8. LintCode 521.去除重复元素
  9. Ubuntu 下生成 python 环境安装文件 requirements.txt
  10. swift 有道 翻译文档(2 条件语句 循环语句)