众所周知,java1.5并发包通过volatile+CAS原理提供了优雅的并发支持。今天仔细想想.net也有volatile关键字保证内存的可见性,同时也有Interlocked提供了CAS的API,因此突发奇想——对着java并发包写一下.net并发包。第一步就是原子类型的实现(.NET目前还没有原子类型)

项目地址:https://github.com/FanHuaRan/Dotnet.Concurrent

一.原子int

/// <summary>
/// 原子int 基于CAS+自旋无锁化编程实现,核心Interlocked
/// 2017/10/18 fhr
/// </summary>
public class AtomicInteger
{
/// <summary>
/// 缺省默认值
/// </summary>
private static readonly int DEFAULT_INITAL_VALUE=;
/// <summary>
/// 被包装的int值
/// </summary>
private volatile int value;
/// <summary>
/// 比较并设置新值 成功返回true 失败返回false
/// </summary>
/// <param name="expect"></param>
/// <param name="update"></param>
/// <returns></returns>
public bool CompareAndSet(int expect, int update)
{
return expect == Interlocked.CompareExchange(ref value, update, expect);
}
/// <summary>
/// 设置新值,返回旧值
/// </summary>
/// <param name="newValue"></param>
/// <returns></returns>
public int GetAndSet(int newValue)
{
return Interlocked.Exchange(ref value, newValue);
}
/// <summary>
/// 自增1,返回新值
/// </summary>
/// <returns></returns>
public int IncrementAndGet()
{
return Interlocked.Increment(ref value);
}
/// <summary>
/// 自增1,返回旧值
/// </summary>
/// <returns></returns>
public int GetAndIncrement()
{
return Interlocked.Increment(ref value)-;
}
/// <summary>
/// 自减一,返回新值
/// </summary>
/// <returns></returns>
public int DecrementAndGet()
{
return Interlocked.Decrement(ref value);
}
/// <summary>
/// 自减一,返回旧值
/// </summary>
/// <returns></returns>
public int GetAndDecrement()
{
return Interlocked.Decrement(ref value)+;
}
/// <summary>
/// 加上add,返回旧值
/// </summary>
/// <param name="add"></param>
/// <returns></returns>
public int GetAndAdd(int add)
{
for (; ; )
{
int current = value;
int next=current+add;
if (CompareAndSet(current,next))
{
return current;
}
}
}
/// <summary>
/// 加上add,返回新值
/// </summary>
/// <param name="add"></param>
/// <returns></returns>
public int AddAndGet(int add)
{
for (; ; )
{
int current = value;
int next = current + add;
if (CompareAndSet(current, next))
{
return current;
}
}
} public AtomicInteger(int inital)
{
this.value = inital;
} public AtomicInteger()
: this(DEFAULT_INITAL_VALUE)
{ }
/// <summary>
/// value getter&setter
/// </summary>
public int Value
{
get { return value; }
set { this.value = value; }
}
/// <summary>
/// 重写hashcode value相关
/// </summary>
/// <returns></returns>
public override int GetHashCode()
{
return value;
}
/// <summary>
/// 重写equals value相关
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public override bool Equals(object obj)
{
if (obj is AtomicInteger&&obj!=null)
{
AtomicInteger atoObj = obj as AtomicInteger;
if (atoObj.Value == Value)
{
return true;
}
}
return false;
}
/// <summary>
/// toString
/// </summary>
/// <returns></returns>
public override string ToString()
{
return value.ToString();
}
}

二.原子long

/// <summary>
/// 原子long 基于CAS+自旋无锁化编程实现,核心Interlocked
/// 2017/10/18 fhr
/// </summary>
public class AtomicLong
{
/// <summary>
/// 缺省默认值
/// </summary>
private static readonly long DEFAULT_LONG_VALUE=;
/// <summary>
/// 被包装的long值
/// </summary>
private volatile long value;
/// <summary>
/// 比较并设置新值 成功返回true 失败返回false
/// </summary>
/// <param name="expect"></param>
/// <param name="update"></param>
/// <returns></returns>
public bool CompareAndSet(long expect, long update)
{
return expect == Interlocked.CompareExchange(ref value, update, expect);
}
/// <summary>
/// 设置新值,返回旧值
/// </summary>
/// <param name="newValue"></param>
/// <returns></returns>
public long GetAndSet(long newValue)
{
return Interlocked.Exchange(ref value, newValue);
}
/// <summary>
/// 自增1,返回新值
/// </summary>
/// <returns></returns>
public long IncrementAndGet()
{
return Interlocked.Increment(ref value);
}
/// <summary>
/// 自增1,返回旧值
/// </summary>
/// <returns></returns>
public long GetAndIncrement()
{
return Interlocked.Increment(ref value)-;
}
/// <summary>
/// 自减一,返回新值
/// </summary>
/// <returns></returns>
public long DecrementAndGet()
{
return Interlocked.Decrement(ref value);
}
/// <summary>
/// 自减一,返回旧值
/// </summary>
/// <returns></returns>
public long GetAndDecrement()
{
return Interlocked.Decrement(ref value)+;
}
/// <summary>
/// 加上add,返回旧值
/// </summary>
/// <param name="add"></param>
/// <returns></returns>
public long GetAndAdd(long add)
{
for (; ; )
{
long current = value;
long next=current+add;
if (CompareAndSet(current,next))
{
return current;
}
}
}
/// <summary>
/// 加上add,返回新值
/// </summary>
/// <param name="add"></param>
/// <returns></returns>
public long AddAndGet(long add)
{
for (; ; )
{
long current = value;
long next = current + add;
if (CompareAndSet(current, next))
{
return current;
}
}
} public AtomicLong(long inital)
{
this.value = inital;
} public AtomicLong()
: this(DEFAULT_LONG_VALUE)
{ }
/// <summary>
/// value getter&setter
/// </summary>
public long Value
{
get { return value; }
set { this.value = value; }
}
/// <summary>
/// 重写hashcode value相关
/// </summary>
/// <returns></returns>
public override long GetHashCode()
{
return value;
}
/// <summary>
/// 重写equals value相关
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public override bool Equals(object obj)
{
if (obj is AtomicLong&&obj!=null)
{
AtomicLong atoObj = obj as AtomicLong;
if (atoObj.Value == Value)
{
return true;
}
}
return false;
}
/// <summary>
/// toString
/// </summary>
/// <returns></returns>
public override string ToString()
{
return value.ToString();
}
}

三.原子bool

    /// <summary>
/// 原子Boolean 基于CAS+自旋无锁化编程实现,核心Interlocked
/// 2017/10/18 fhr
/// </summary>
public class AtomicBoolean
{
private static readonly int TRUE_INT = ; private static readonly int FALSE_INT = ; /// <summary>
/// 被包装的boolean值 int表示 0为false 1为真
/// </summary>
private volatile int value; /// <summary>
/// 比较并设置新值 成功返回true 失败返回false
/// </summary>
/// <param name="expect"></param>
/// <param name="update"></param>
/// <returns></returns>
public bool CompareAndSet(bool expect, bool update)
{
int e = expect ? TRUE_INT : FALSE_INT;
int u = update ? TRUE_INT : FALSE_INT;
return e == Interlocked.CompareExchange(ref value, u, e);
} /// <summary>
/// 设置新值,返回旧值
/// </summary>
/// <param name="newValue"></param>
/// <returns></returns>
public bool GetAndSet(bool newValue)
{
int n = newValue ? TRUE_INT : FALSE_INT;
return Interlocked.Exchange(ref value, n) == TRUE_INT;
} public AtomicBoolean(bool inital)
{
Value = inital;
} public AtomicBoolean()
: this(false)
{ }
/// <summary>
/// value getter&setter
/// </summary>
public bool Value
{
get { return value==TRUE_INT; }
set
{
this.value = value==true?TRUE_INT:FALSE_INT;
}
}
/// <summary>
/// 重写hashcode value相关
/// </summary>
/// <returns></returns>
public override long GetHashCode()
{
return value.GetHashCode();
}
/// <summary>
/// 重写equals value相关
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public override bool Equals(object obj)
{
if (obj is AtomicBoolean && obj != null)
{
AtomicBoolean atoObj = obj as AtomicBoolean;
if (atoObj.Value == Value)
{
return true;
}
}
return false;
}
/// <summary>
/// toString
/// </summary>
/// <returns></returns>
public override string ToString()
{
return value.ToString();
}
}

剩下完成原子引用+原子数组+AQS及同步器

有志同道合的朋友一起参与哦

github:https://github.com/FanHuaRan/Dotnet.Concurrent

对着java并发包写.net并发包之原子类型实现的更多相关文章

  1. c++ c# java 调用 c++ 写的dll

    1. vs 中新建win32 dll 项目   testdll 添加实现文件       test.cpp #include "stdafx.h" #include <ios ...

  2. Java自己动手写连接池四

    Java自己动手写连接池四 测试: package com.kama.cn; import java.sql.Connection; public class Test { public static ...

  3. Java自己动手写连接池三

    Java自己动手写连接池三,核心代码; package com.kama.cn; import java.sql.Connection;import java.util.ArrayList;impor ...

  4. Java将数据写进excel

    Java将数据写进excel Java将数据写进excel class User { private String name ; private String password; public Use ...

  5. 优秀 Java 程序员写代码的风格,不再留坑给别人

    往 期 精 彩 推 荐    [1]Java Web技术经验总结 [2]15个顶级Java多线程面试题及答案,快来看看吧 [3]面试官最喜欢问的十道java面试题 [4]从零讲JAVA ,给你一条清晰 ...

  6. 优秀 Java 程序员写代码的风格

    往 期 精 彩 推 荐    [1]Java Web技术经验总结 [2]15个顶级Java多线程面试题及答案,快来看看吧 [3]面试官最喜欢问的十道java面试题 [4]从零讲JAVA ,给你一条清晰 ...

  7. 【转载】java调用C++写的DLL

    用java调用C++写的DLL一直以来都是一个比较麻烦但又很常见的问题. 我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦的. 如果有一个现有的 .dll/.so 文件,如 ...

  8. JAVA一个文件写多个类

    JAVA一个文件写多个类,并且是同级类,需注意: 在一个.java文件中可以有多个同级类,  其修饰符只可以public/abstract/final/和无修饰符 public修饰的只能有一个,且必须 ...

  9. java 从零开始手写 RPC (03) 如何实现客户端调用服务端?

    说明 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 写完了客户端和服务端,那么如何实现客户端和服务端的 ...

随机推荐

  1. java记事本1.2版

    功能:实现了新建,打开,保存,退出,复制,剪切,粘贴等功能 效果图:

  2. 201521123025《JAVA程序设计》第6周学习总结

    1. 本章学习总结 2. 书面作业 Q1.clone方法 1.1Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 要克隆对象要覆盖clon ...

  3. 201521123117 《Java程序设计》第9周学习总结

    1. 本周学习总结 2. 书面作业 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 经常出现Numbe ...

  4. 201521123048 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  5. 201521123104 《Java程序设计》 第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 2. 书面作业 1. finally(题目4-2) 1.1 截图你的提交结果(出现学号) 1.2 4-2中f ...

  6. log4j的基本使用和参数设定

    1.简介 apache的一个开放源代码项目. 精确控制日志的输出,包括输出的格式,输出的目的地,输出的过滤(不同级别日志的输出)等. 配置简单,不需要在代码中配置环境,支持两种配置文件格式,XML和J ...

  7. 短视频图像处理 OpenGL ES 实践

    2017年,短视频正以其丰富的内容表现力和时间碎片化的特点,快速崛起,而短视频最具可玩性之处就在支持人脸识别的动态贴图和各种不同效果的美颜.滤镜等.那短视频动态贴纸.滤镜.美颜等功能究竟是如何实现的呢 ...

  8. python入门之一python安装及程序运行

    Python 程序要运行,需要先安装python解释器 PVM(这里可对照java的JVM来理解)实际上,你不需要单独安装,直接安装python后就可以了 1.安装python 下载地址:http:/ ...

  9. 一个非常好用的框架-AngularJS(一)

      前  言           AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.An ...

  10. ThinkJS框架入门详细教程(一)开发环境

    一.前端标配环境 1.nodeJS正确安装,可以参考:http://www.cnblogs.com/chengxs/p/6221393.html 2.git正确安装,可以参考:http://www.c ...