InterLocked学习笔记
在进行多线程编程的时候特别重要的一点就是多线程的同步,什么是同步呢?字面意思就是使多个不在同一线程执行的代码统一到一个线程中执行,但是对执行中的线程过程却无法控制,这就造成了多个线程可能同时操作同一个变量,于是就出现了得到的结果不是想要的结果,为了避免这个情况,我们常用的方法是加锁例如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—的功能。
- Add方法

作用为将location1与value相加,结果存入location1中,返回求和后的结果
int a = 10, b = 12;
int result = 0;
result = Interlocked.Add(ref a, b);
Console.WriteLine(result);
Console.WriteLine(a);

- 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);

- Exchange

将参数2赋值给参数1,并返回参数1的原始值
int a = 10, b = 12; int result = 0;
result = Interlocked.Exchange(ref a, b);
Console.WriteLine(result);
Console.WriteLine(a);

- 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学习笔记的更多相关文章
- WebSocket学习笔记IE,IOS,Android等设备的兼容性问
WebSocket学习笔记IE,IOS,Android等设备的兼容性问 一.背景 公司最近准备将一套产品放到Andriod和IOS上面去,为了统一应用的开发方式,决定用各平台APP嵌套一个HTML5浏 ...
- Learning hard 学习笔记
第一章 你真的了解C#吗 1.什么是C#, 微软公司,面向对象,运行于.NET Framework之上, 2.C#能编写哪些应用程序, Windows应用桌面程序,Web应用程序,Web服务, 3.什 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
随机推荐
- 小程序重新封装打印函数console.log
习惯性使用console.log打印获取到的数据,信息等,然后上星期大佬看见了说怎么那么多打印信息出来,线上那个也是吗?问我能不能线上的就不打印出来? 我就说那就封装一个打印函数呗. 重写一个没问题, ...
- vue项目开发时怎么解决跨域
vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow-Origin' header is prese ...
- dedecms 后台可以上传mp4,但无法选择
原文链接 找到 /include/dialog/select_media.php 找到rmvb,在其后面加 “|mp4” 即可. 1
- python多版本管理工具(pyenv)
在学习和利用python开发的很多情况下,需要多版本的Python并存.此时需要在系统中安装多个Python,但又不能影响系统自带的 Python.pyenv 就是这样一个 Python 版本管理器. ...
- javascript 编程风格 部分精要
1 换行保持两个缩进(通常是一行太长) 运算符前后加一个空格,包括赋值运算符和逻辑运算符 括号运算符,左括号之后,右括号之前不应该有空格 段代码无关,添加空行 命名驼峰式,一般首字母小写,其他单词首字 ...
- [微信小程序]编译.wxss出错,2 not found
小程序新建项目就出错:2 not found 编译.wxss文件出错(不是一般的郁闷,新建项目就报错...) 大概的情况是开发工具没有更新.或更新不到, 第一,可以删掉开发工具重新下载最新安装: 第 ...
- Android Studio 设置不同分辨率的图标Icon
右键你的项目 -->"NEW"-->"Image Asset" 'Asset Type' 勾选”Image“才可以选择”Path“,其他选项可以自己 ...
- ORACLE 查询近一天,近半小时内的数据
SELECT 字段 FROM 表名 WHERE 时间字段 BETWEEN SYSDATE-1 AND SYSDATE; //查询一天内的数据 sysdate+1 加一天sysdate+1/24 ...
- Mesos源码分析(1): Mesos的启动过程总论
- MSSQL事务隔离级别详解(SET TRANSACTION ISOLATION LEVEL)
控制到 Transact-SQL 的连接发出的 SQL Server 语句的锁定行为和行版本控制行为. TRANSACT-SQL 语法约定 语法 -- Syntax for SQL Server ...