众所周知,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. 【1414软工助教】团队作业7——Alpha冲刺之事后诸葛亮 得分榜

    题目 团队作业7--Alpha冲刺之事后诸葛亮 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 团队作业1:团队展示 团队作业2:需求分析& ...

  2. Swing-JComboBox用法-入门

    JComboBox是Swing中的下拉菜单控件.它永远只能选中一个项目,然而比单选按钮节省空间.如果使用setEditable设置为true则内部选项的文本可以编辑,因此这种组件被称为组合框.注意,对 ...

  3. 201521123122 《java程序设计》 第三周学习总结

    1. 本章学习总结 你对于本章知识的学习总结 链接点击此处 2. 书面作业 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private s ...

  4. 201521123028《Java程序设计》第1周学习总结

    1. 本周学习总结 通过本周的学习: 1.了解了Java的发展史(从OAK转向Internet,并逐步发展至今的历程) 2.与C语言比较,Java语言的特点: ①将源程序编译成一种结构中立的中间文件格 ...

  5. PTA中提交Java程序的一些套路

    201708新版改版说明 PTA与2017年8月已升级成新版,域名改为https://pintia.cn/,官方建议使用Firefox与Chrome浏览器. 旧版 PTA 用户首次在新版系统登录时,请 ...

  6. 201521123039《java程序设计》第十四周学习总结

    1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) 2 ...

  7. 201521123042《Java程序设计》第13周学习总结

    本次作业参考文件 正则表达式参考资料 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.bai ...

  8. 201521123032 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  9. 201521123074 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 Q1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...

  10. Ajax跨域问题的出现和解决

    什么是跨域? 1).请求是执行过去了,但是响应的数据拿不到 2).浏览器有一个安全限制叫同源策略(针对ajax请求): 从http://localhost:80/member/apply.html页面 ...