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 ...
随机推荐
- Eclipse自动补全调教
方法来自http://www.cnblogs.com/sunjie21/archive/2012/06/28/2567463.html 调教后可以做到: 1. sout + Tab 输出System. ...
- 服务器黑屏,只出现cmd窗口的解决办法
先上图,如图所示,正常启动或者进入安全模式都出现此现象,尝试了各种办法,比如: 1.打开此页面后,重新开一台可以远程的电脑连接,此方法不通: 2.进任务管理器无explorer.exe进程,且创建此进 ...
- MangoDb的安装及使用
安装步骤 一.创建文件 vi /etc/yum.repos.d/mongodb-org-3.6.repo 二.配置文件内容 [mongodb-org-3.6] name=MongoDB Reposit ...
- Linux 搭建Nginx+uWSGI+Django环境
安装环境 sudo apt-get install nginx sudo apt install python3 sudo apt install python3-pip 使用 sudo pip3 i ...
- linux-Vim命令合集
Vim命令合集 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filena ...
- post数据时报错:远程服务器返回错误: (400) 错误的请求。
网上查了多种方法,有不少说法,报400说是传的数据格式不对,最后的结论确实是数据格式不对. Content_Type为:application/json,配的数据格式有些麻烦,特别数多层,单层还好.例 ...
- 请输入一个大于7的整数,输出小于k并且至少满足下面2个条件中的1个条件的所有正整数
import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 22:06 * @description ...
- 【二代示波器教程】第14章 uCOS-III操作系统版本二代示波器实现
第14章 uCOS-III操作系统版本二代示波器实现 本章教程为大家讲解uCOS-III操作系统版本的二代示波器实现.主要讲解RTOS设计框架,即各个任务实现的功能,任务间的通信方案选择,任 ...
- 深入理解Spring Redis的使用 (五)、常见问题汇总
目前我所知道的Redistemplate里面,我没有使用到的就是管道.这个可以进行批量的读写.类似于jdbc的batch.还有就是Redis的集群部署.但是由于我业务里没有这种需求,所以没有使用无法给 ...
- Android OpenGL ES 开发(七): OpenGL ES 响应触摸事件
像旋转三角形一样,通过预设程序来让对象移动对于吸引注意是很有用的,但是如果你想让你的OpenGL图形有用户交互呢?让你的OpenGL ES应用有触摸交互的关键是,扩展你的GLSurfaceView的实 ...