在进行多线程编程的时候特别重要的一点就是多线程的同步,什么是同步呢?字面意思就是使多个不在同一线程执行的代码统一到一个线程中执行,但是对执行中的线程过程却无法控制,这就造成了多个线程可能同时操作同一个变量,于是就出现了得到的结果不是想要的结果,为了避免这个情况,我们常用的方法是加锁例如locked,但是为了一个很简单的操作例如a++这样的操作频繁的locked对性能的影响得不偿失,所以就需要用到InterLocked这样的原子操作,因为原子操作是基于硬件层面的非阻塞的操作,所以性能非常的好。

下面是一个多线程的实例代码,当注释掉locked这一行的时候,可以发现几乎每一次得到的结果都不一样。

int total = 0;

object obj = new object();

for (int i = 0; i <= 50; i++)

{

Thread thread = new Thread(new ThreadStart(() =>

{

for (int j = 0; j < 20; j++)

{

lock (obj)

{

total += j;

}

}

}));

thread.Start();

}

Thread.Sleep(1000);

Console.WriteLine(total);

这段代码可以修改为如下的代码

for (int j = 0; j < 20; j++)

{

//lock (obj)

//{

//    total += j;

//}

Interlocked.Add(ref total, j);

}

运行后可以看到每一次的结果都是相同的,而且都是正确的

微软为我们提供了Interlocked,他其中包含了一下方法,根据方法名就可以知道每一个方法的作用,例如上面示例的Add方法,就是将两个数字相加,而Increment和Decrement就是实现类似于x++,x—的功能。

  1. Add方法

作用为将location1与value相加,结果存入location1中,返回求和后的结果

int a = 10, b = 12;

int result = 0;

result = Interlocked.Add(ref a, b);

Console.WriteLine(result);

Console.WriteLine(a);

  1. Increment与Decrement

int a = 10, b = 12;

int result = 0;

//result = Interlocked.Add(ref a, b);

result = Interlocked.Increment(ref a);

Console.WriteLine(result);

result = Interlocked.Decrement(ref b);

Console.WriteLine(a);

Console.WriteLine(result);

Console.WriteLine(b);

  1. Exchange

将参数2赋值给参数1,并返回参数1的原始值

int a = 10, b = 12; int result = 0;

result = Interlocked.Exchange(ref a, b);

Console.WriteLine(result);

Console.WriteLine(a);

  1. CompareExchange

比较参数3与参数1如果相等则使用参数2替换参数1,返回参数1的原始值

int a = 10, b = 12, c = 12;

int result = 0;

result = Interlocked.CompareExchange(ref a, b, c);

Console.WriteLine(result);

Console.WriteLine(a);

int a = 10, b = 12, c = 10;

int result = 0;

result = Interlocked.CompareExchange(ref a, b, c);

Console.WriteLine(result);

Console.WriteLine(a);

InterLocked学习笔记的更多相关文章

  1. WebSocket学习笔记IE,IOS,Android等设备的兼容性问

    WebSocket学习笔记IE,IOS,Android等设备的兼容性问 一.背景 公司最近准备将一套产品放到Andriod和IOS上面去,为了统一应用的开发方式,决定用各平台APP嵌套一个HTML5浏 ...

  2. Learning hard 学习笔记

    第一章 你真的了解C#吗 1.什么是C#, 微软公司,面向对象,运行于.NET Framework之上, 2.C#能编写哪些应用程序, Windows应用桌面程序,Web应用程序,Web服务, 3.什 ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  6. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  7. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  8. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  9. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

随机推荐

  1. vbs编写一个函数,将1001到1050(50串数字)读入test.txt文件。每串数字占一行,不是覆盖。

    Option Explicit---------------------------------------------------------开头 dim fas,objfso,printstr,o ...

  2. h5唤起APP并检查是否成功

    // 检查app是否打开 function checkOpen(cb) { const clickTime = +(new Date()); function check(elsTime) { if ...

  3. [LeetCode] Possible Bipartition 可能的二分图

    Given a set of N people (numbered 1, 2, ..., N), we would like to split everyone into two groups of  ...

  4. SElinux安全子系统---学习

    SElinux是一个强制访问控制的安全子系统,是为了让各个服务进程都受到约束,只能获取到属于自己的资源 SElinux有三种配置模式: 1:enforcing--强制启动安全配置策略,拦截不合法的请求 ...

  5. python基础之面向对象1

    一.面向对象VS面向过程 1.面向过程 2.面向对象 二.类与对象 1.类和对象 (1)基本概念 类和对象的内存图如下: 2.实例成员 (1)实例变量 (2)实例方法: 3.类成员: (1)类变量 ( ...

  6. 3种方法来在Linux电脑上查找文件

    如果你不太了解Linux命令,那么在Linux系统里查找文件是比较困难的.只要使用多种不同的终端命令,可以很快地找到文件.Linux命令比其它操作系统的搜索功能更加强大,掌握这些命令就能你完全控制这些 ...

  7. SUSE12Sp3-MongoDB安装

    1.解压 sudo mkdir /usr/local/mongodb # 创建mongodb目录 将mongodb-linux-x86_64-suse12-4.0.6.tgz复制到/usr/local ...

  8. .Net Core中Dapper的使用详解

    Dapper 是一个轻量级ORM框架,在项目中如果对性能比较看中,Dapper是一个不错的选择.接下来我们就来看看如何在项目中使用Dapper. 1.安装Dapper 这里直接使用Nuget安装.   ...

  9. [Swift]LeetCode661. 图片平滑器 | Image Smoother

    Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother t ...

  10. 本地安装MySQL详细教程

    第1章   MySQL的安装与使用 1.1  MySQL安装与配置 1.1.1 MYSQL的安装 1.打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“set ...