多线程相关Interlocked.Increment问题
今天群里有人问到如下代码打印出来的东西为什么不是连续得,所以有大神解释了原因。在这过程中遇到了些奇怪的情况
static void Main(string[] args)
{ for (int i = 0; i < 10; i++)
{
new System.Threading.Thread(Foo).Start();
} //System.Threading.Thread.Sleep(20);
//Console.WriteLine(num); Console.Read();
} static int num = 0; static void Foo()
{
Console.WriteLine(num);
Interlocked.Increment(ref num); }
我第一次想的是这个Interlocked.Increment是原子的增加,多个线程同时访问也不会引起数据的错误 ,所以显示虽然是无序的,但是只要数据不重复就是正常的,我觉得打印出来的数字不会重复。
但是我写下上面代码运行看结果时发现还是有重复的,这是什么情况? 为什么还会重复呢?难道Interlocked.Increment不是原子的操作?因该是只允许一个进程操作,也就是数据不会出错才对。
后来看到Console.WriteLine(num)这里,我才想到,其实显示出来的是Console.WriteLine(num)这里的读取,虽然下面一行增加是能保证只有一个线程操作,但是上面这行不一定,所以显示是有相同的情况?为了确认是否这样,我在是后加上了两行。
System.Threading.Thread.Sleep(20);
Console.WriteLine(num);
从这里可以显示出num的最后值,如果过程中操作是有几个线程同时操作的话,这里的数据也不会是10.可以最后显示是10,也就是Interlocked.Increment方法没有问题。
如果要让这相显示正常可以把这两行一起加上lock(){} 这保证。 即然这样那Interlocked.Increment()还有什么用?可能也只有最后查看这个增量标识才有用。
多线程相关Interlocked.Increment问题的更多相关文章
- Interlocked.Increment 方法 和Interlocked.Decrement 方法作用
Interlocked.Increment 方法:让++成为原子操作:Interlocked.Decrement 方法让--成为原子操作.什么叫原子操作呢.就是不会被别人打断,因为C#中的一个语句,编 ...
- Interlocked.Increment()函数详解 (转载)
原文地址 class Program { static object lockObj = new object(); ; ; //假设要处理的数据源 , ).ToList(); static void ...
- .Net Core在X86上实现Interlocked.Increment(ref long)的方式
因为在X86上long会被分割为两个int进行操作, 那么Interlocked.Increment的实现成为了一个问题. 在一番搜索后未发现有现成的文章解释这个问题,于是我就动手分析了. 这篇是笔记 ...
- Java多线程相关的
很多小伙伴在学习Java的时候,总是感觉Java多线程在实际的业务中很少使用,以至于不会花太多的时间去学习,技术债不断累积!等到了一定程度的时候对于与Java多线程相关的东西就很难理解,今天需要探讨的 ...
- Sqlite多线程相关整理
Sqlite多线程相关整理 Sqlite With MultiThreads 什么是线程安全? 当多个线程访问某个方法时,不管你通过怎样的调用方式.或者说这些线程如何交替地执行,我们在主程序中不需要去 ...
- C#原子操作(Interlocked.Decrement和Interlocked.Increment)
一.概念 在多线程环境中,不会被线程调度机制打断的操作:这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程). 二.类 System.Threadin ...
- 多线程相关------临界区CriticalSection
多线程一直是短板,整理相关知识方便查询 临界区(Critical Section) 临界区是一段供线程独占式访问的代码.在任意时刻,若有一个线程正在访问该代码段,如果其他所有试图访问的线程都将被挂起, ...
- windows多线程相关
1.多线程同步的方法 a)entercirticalsection leaveciriticalsection b)Mutex互斥对象 waitforsingleobject releasemutex ...
- 2018/1/15 JAVA多线程相关
本文不说synchronized相关,它就是JAVA的一个保留关键字,jdk自己实现了它,但说真的,可应用场景真的少,相比lock接口,它还是被淘汰好吧; 首先,说说lock接口,lock接口是一个工 ...
随机推荐
- firefox渗透师必备的利器
工欲善必先利其器,firefox一直是各位渗透师必备的利器,小编这里推荐34款firefox渗透测试辅助插件,其中包含渗透测试.信息收集.代理.加密解密等功能. 1:Firebug Firefox的 ...
- TCP的流量控制和拥塞控制
1.TCP的流量控制 一般说来,我们总是希望数据传输的更快一些.但如果发送方吧数据发送的过快,接收方就可能来不及接收,就会造成数据的丢失.所谓的流量控制就是让发送方的发送速率不要太快,要让接收方来的及 ...
- hdu 4223 Dynamic Programming?
Dynamic Programming? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- Zeller公式推导及C#代码示例(待完善)
Zeller公式用于计算给定日期是星期几. 该方法可以用数论知识进行证明. 假设给定日期Date为Year-Month-Day,求解该日期是星期几的问题实际上就是以之前某个确定星期几的日期作为参考点, ...
- Mac开发环境搭建
参考文档一:Mac 开发者常用的工具 参考文档二:高效 MacBook 工作环境配置 IntelliJ IDEA 简体中文专题教程 IntelliJ IDEA 相关技巧视频 IntelliJ IDEA ...
- YII的关联查询
先看数据表中的关系是怎样的: customer表中的关系如下: order中的表为: 先在customer中获得order的数据,并与之关联,在 helloController.php 中,代码如下 ...
- iOS - UIProgressView
前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIProgressView : UIView <NSCoding> @available(iOS 2. ...
- Python内置函数filter, map, reduce
filter.map.reduce,都是对一个集合进行处理,filter很容易理解用于过滤,map用于映射,reduce用于归并. 是Python列表方法的三架马车. 1. filter函数的功能相当 ...
- CentOS 7 下的软件安装建议
https://seisman.info/how-to-install-softwares-under-centos-7.html https://seisman.info/linux-environ ...
- xutils使用过程
1,导入xutils的jar包 2,添加xutils需要使用的权限 <uses-permission android:name="android.permission.INTERNET ...