[.net 多线程] Interlocked实现CAS操作
Interlocked:为多个线程共享的变量提供原子操作。
Interlocked.Increment(ref value) | 数值加一(原子性操作) |
Interlocked.Decrement(ref value) | 数值减一(原子性操作) |
Interlocked.Exchange(ref value1, value2) | 交换:把值2赋给值1;返回原值 |
Interlocked.CompareExchange(ref value1, value2, value3) | 实现比较和交换两种功能:值1和值3比较,如果相同,把值2给值1,不相同则不作任何操作;返回原值(多用于判断条件)(示例3中会用到) |
- 实现原子级运算
int increament = ;
Thread th1 = new Thread(() =>
{
for (int i = ; i < ; i++)
Console.WriteLine($"th1 {Interlocked.Increment(ref increament)}");
}); Thread th2 = new Thread(() =>
{
for (int i = ; i < ; i++)
Console.WriteLine($"th2 {Interlocked.Increment(ref increament)}");
}); Thread th3 = new Thread(() =>
{
for (int i = ; i < ; i++)
Console.WriteLine($"th3 {Interlocked.Increment(ref increament)}");
}); Thread th4 = new Thread(() =>
{
for (int i = ; i < ; i++)
Console.WriteLine($"th4 {Interlocked.Increment(ref increament)}");
}); th1.Start();
th2.Start();
th3.Start();
th4.Start();
Console.ReadKey();
实现递增计算
运行结果:
int increament = ;
Thread th1 = new Thread(() =>
{
for (int i = ; i < ; i++)
//Console.WriteLine($"th1 {Interlocked.Increment(ref increament)}");
Console.WriteLine($"th1 {increament++}");
}); Thread th2 = new Thread(() =>
{
for (int i = ; i < ; i++)
//Console.WriteLine($"th2 {Interlocked.Increment(ref increament)}");
Console.WriteLine($"th2 {increament++}");
}); Thread th3 = new Thread(() =>
{
for (int i = ; i < ; i++)
//Console.WriteLine($"th3 {Interlocked.Increment(ref increament)}");
Console.WriteLine($"th3 {increament++}");
}); Thread th4 = new Thread(() =>
{
for (int i = ; i < ; i++)
//Console.WriteLine($"th4 {Interlocked.Increment(ref increament)}");
Console.WriteLine($"th4 {increament++}");
}); th1.Start();
th2.Start();
th3.Start();
th4.Start();
Console.ReadKey();
非原子并行计算
- 模拟锁
用Exchange函数实现锁
//0 for false, 1 for true.
private static int usingResource = ;
//A simple method that denies reentrancy.
static bool UseResource()
{
//0 indicates that the method is not in use.
if ( == Interlocked.Exchange(ref usingResource, ))
{
Console.WriteLine("{0} acquired the lock", Thread.CurrentThread.Name); //Code to access a resource that is not thread safe would go here. //Simulate some work
Thread.Sleep(); Console.WriteLine("{0} exiting lock", Thread.CurrentThread.Name); //Release the lock
Interlocked.Exchange(ref usingResource, );
return true;
}
else
{
Console.WriteLine(" {0} was denied the lock", Thread.CurrentThread.Name);
return false;
}
}
用Exchange模拟锁
用CompareExchange函数实现锁
private double totalValue = 0.0; public double Total { get { return totalValue; } } public double AddToTotal(double addend)
{
double initialValue, computedValue;
do
{
initialValue = totalValue;//---(1)
computedValue = initialValue + addend;//---(2) }
while (initialValue != Interlocked.CompareExchange(ref totalValue,
computedValue, initialValue));
//Interlocked.CompareExchange:比较totalValue与initialValue是否相同,如果相同,则用computedValue的值覆盖totalValue //如果totalValue与initialValue值不相同,则说明在(1)与(2)步骤执行的同时,
//其他线程执行了对totalValue进行了改变
return computedValue;
}
CompareExchange模拟锁
原子操作参考:http://www.cnblogs.com/5iedu/p/4719625.html
[.net 多线程] Interlocked实现CAS操作的更多相关文章
- CPU的CAS操作
https://blog.csdn.net/qq_35492857/article/details/78471032 https://www.cnblogs.com/gdjdsjh/p/5076815 ...
- 【Java并发编程实战】-----“J.U.C”:CAS操作
CAS,即Compare and Swap,中文翻译为"比较并交换". 对于JUC包中,CAS理论是实现整个java并发包的基石.从整体来看,concurrent包的实现示意图如下 ...
- Go并发编程之美-CAS操作
摘要: 一.前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁.CAS.原子变量操作类.相比Java来说go提供了独特的基于通道的同步措施.本节我 ...
- 具体CAS操作实现(无锁算法)
具体CAS操作 上一篇讲述了CAS机制,这篇讲解CAS具体操作. 什么是悲观锁.乐观锁?在java语言里,总有一些名词看语义跟本不明白是啥玩意儿,也就总有部分面试官拿着这样的词来忽悠面试者,以此来找优 ...
- 深入浅出 Java Concurrency (5): 原子操作 part 4 CAS操作
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁). 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度 ...
- Java乐观锁实现之CAS操作
介绍CAS操作前,我们先简单看一下乐观锁 与 悲观锁这两个常见的锁概念. 悲观锁: 从Java多线程角度,存在着“可见性.原子性.有序性”三个问题,悲观锁就是假设在实际情况中存在着多线程对同一共享的竞 ...
- 无锁的同步策略——CAS操作详解
目录 1. 从乐观锁和悲观锁谈起 2. CAS详解 2.1 CAS指令 2.3 Java中的CAS指令 2.4 CAS结合失败重试机制进行并发控制 3. CAS操作的优势和劣势 3.1 CAS相比独占 ...
- 锁、CAS操作和无锁队列的实现
https://blog.csdn.net/yishizuofei/article/details/78353722 锁的机制 锁和人很像,有的人乐观,总会想到好的一方面,所以只要越努力,就会越幸运: ...
- 多线程之:java的CAS操作的相关信息
一:锁机制存在的性能问题? 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁). 锁机制存在以下问题:(1)在多线程竞争下,加锁.释放锁会导 ...
随机推荐
- JCE无限制权限策略文件
JCE无限制权限策略文件,里面是对应jdk6和jdk7的文件 官网下载地址是 JDK6:http://www.oracle.com/technetwork/java/javase/downloads/ ...
- python开发进程:进程开启方式&多进程
一,进程的开启方式 利用模块开启进程 from multiprocessing import Process import time,random import os def piao(name): ...
- win10下默认使用福昕打开PDF
win10为了推他的edge浏览器, 将默认的pdf打开设置为了edge浏览器, 非常令人反感, 做浏览器就好好做浏览器, 为什么要默认打开pdf? 而且修改默认为福昕后, 下次打开pdf文件, 他又 ...
- C++11 变量和函数的链接性
在全局变量前添加const或者static,则该变量链接性为内部,即文件内有效.可以使用extern声明为外部. 如果要让函数的链接性为内部,则函数声明和定义都应使用static关键字. 例子: te ...
- Java Web发布
记得开始学习Java Web的时候,首先用的是Eclipse开发,但是有一个问题始终没有弄明白,做好的Web项目是如何发布到Tomcat服务器上的呢?最后得到了一个结论,那就是Eclipse这个软件可 ...
- Angular 6 HMR 热加载配置
什么是 HMR? HMR 是hot module replacement 的简称,直译:热模块替换,如果不开启HMR模式,angular项目在模块更改的时候会从根节点开始刷新,开启HMR模式以后, ...
- Python下OS模块重命名方法renames
在python中有很多强大的模块,其中我们经常要使用的就是OS模块,OS模块提供了超过200个方法来供我们使用,并且这些方法都是和数据处理相关的,这里介绍下重命名这个方法. OS的重命名方法是os.r ...
- C#通用模块专题
开源 程序设计 常用组件 加载图片,播放音乐.视频,摄像头拍照 文件读写(txt.xml.自定义文件格式(后缀名)) 串口通信 稳定的串口读写:http://blog.csdn.net/kolvin2 ...
- php 中php-fpm 的重启、终止操作命令
php 中php-fpm 的重启.终止操作命令: service nginx restart service php-fpm restart 查看php-fpm进程数:ps aux | grep -c ...
- Angular4中利用promise异步加载gojs
GoJS是一个实现交互类图表(比如流程图,树图,关系图,力导图等等)的JS库 gojs提供了angular的基本例子,不过是离线版 https://github.com/NorthwoodsSoftw ...