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操作的更多相关文章

  1. CPU的CAS操作

    https://blog.csdn.net/qq_35492857/article/details/78471032 https://www.cnblogs.com/gdjdsjh/p/5076815 ...

  2. 【Java并发编程实战】-----“J.U.C”:CAS操作

    CAS,即Compare and Swap,中文翻译为"比较并交换". 对于JUC包中,CAS理论是实现整个java并发包的基石.从整体来看,concurrent包的实现示意图如下 ...

  3. Go并发编程之美-CAS操作

    摘要: 一.前言 go语言类似Java JUC包也提供了一些列用于多线程之间进行同步的措施,比如低级的同步措施有 锁.CAS.原子变量操作类.相比Java来说go提供了独特的基于通道的同步措施.本节我 ...

  4. 具体CAS操作实现(无锁算法)

    具体CAS操作 上一篇讲述了CAS机制,这篇讲解CAS具体操作. 什么是悲观锁.乐观锁?在java语言里,总有一些名词看语义跟本不明白是啥玩意儿,也就总有部分面试官拿着这样的词来忽悠面试者,以此来找优 ...

  5. 深入浅出 Java Concurrency (5): 原子操作 part 4 CAS操作

    在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁). 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度 ...

  6. Java乐观锁实现之CAS操作

    介绍CAS操作前,我们先简单看一下乐观锁 与 悲观锁这两个常见的锁概念. 悲观锁: 从Java多线程角度,存在着“可见性.原子性.有序性”三个问题,悲观锁就是假设在实际情况中存在着多线程对同一共享的竞 ...

  7. 无锁的同步策略——CAS操作详解

    目录 1. 从乐观锁和悲观锁谈起 2. CAS详解 2.1 CAS指令 2.3 Java中的CAS指令 2.4 CAS结合失败重试机制进行并发控制 3. CAS操作的优势和劣势 3.1 CAS相比独占 ...

  8. 锁、CAS操作和无锁队列的实现

    https://blog.csdn.net/yishizuofei/article/details/78353722 锁的机制 锁和人很像,有的人乐观,总会想到好的一方面,所以只要越努力,就会越幸运: ...

  9. 多线程之:java的CAS操作的相关信息

    一:锁机制存在的性能问题? 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁). 锁机制存在以下问题:(1)在多线程竞争下,加锁.释放锁会导 ...

随机推荐

  1. Ubuntu 下使用 mutt 和 msmtp 发送 Gmail 邮件

    参考:        http://www.cnblogs.com/refrag/archive/2012/11/28/2793533.html         http://www.habadog. ...

  2. 杂项:UN-HTML

    ylbtech-杂项:HTML 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9.返回顶部   1 ...

  3. hibernate缓存机制详细介绍

    hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别). 一:hibernate的 N+1问题 list()获得对象: 如果通过list()方法 ...

  4. 浏览器访问IPv6地址

    http://[IPv6]:port/index.html http://[3ffe:3201:1200:1::91]:8080/index.html 目前现在的网络运营商基本都不支持基于IPv6地址 ...

  5. PHP字符串的处理(二)-字符串的格式化

    1.字符串大小写的转换 strtoupper():将字符串全部转换为大写字母 strtolower():将字符串全部转换为小写字母 ucfirst():将字符串中的首字母转换为大写,其余字符不变 uc ...

  6. python's eleventh day for me

    python2 中没有nonlocal. 函数名是什么? 函数名就是函数的名字, 本质:变量,特殊的变量. 1.单独打印函数名: def func(): print(666) print(func) ...

  7. C++学习路线(转载)

    随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移 ...

  8. Mycat主从模式下的读写分离与自动切换

    1. 机器环境 192.168.2.136 mycat1 192.168.2.134 mydb1 192.168.2.135 mydb2 2在mysql1.mysql2上安装mysql 更改root用 ...

  9. ubuntu12上部署Django1.8.4+uwsgi+nginx超级详细流程配置到云服务器

    环境: 系统:ubuntu12,系统自带默认有python2.7 框架:Django1.8.4,需要python2.7以上才能支持   前言: 用户浏览器发送http请求->nginx(静态文件 ...

  10. 魔戒(思维+bfs)

    Description 蓝色空间号和万有引力号进入了四维水洼,发现了四维物体--魔戒. 这里我们把飞船和魔戒都抽象为四维空间中的一个点,分别标为 "S" 和 "E&quo ...