众所周知,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. 201521123078 《Java程序设计》第6周学习总结

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

  2. 201521123004 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 协议.IP.域名.端口号 协议:网络中为了进行数据交换(通信)而建立的规则.标准或约定(=语义+语法+规则 ...

  3. 201521123033《Java程序设计》第10周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. answer: 2. 书面作业 本次PTA作业题集异常.多线程 1.finally 题目4-2 1.1 截图 ...

  4. 201521123109 《java程序设计》第13周学习总结

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

  5. 201521123026 《java程序设计》 第九周学习总结

    1. 本章学习总结 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 Q1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) PTA提交结果: 运行结果截图: 1.2 ...

  6. video标签

    Video标签的使用 Video标签含有src.poster.preload.autoplay.loop.controls.width.height等几个属性, 以及一个内部使用的标签<sour ...

  7. python实例编写(2)--等待,一组对象,层级元素,frame对象处理

    一.设置等待 #coding=utf-8 from selenium import webdriver from selenium.webdriver.support.ui import WebDri ...

  8. 使用apache反向代理tomacat

    起源 在大部分的生产环境中,基本上使用的都是java程序,从而促进了各种应用程序中间件的产生,在这里大概有几种,tomcat作为最著名的开源servlet容器,jboss也是开源的,而且有管理界面,主 ...

  9. CentOS7安装后配置MariaDB

    安装后,优先推荐先对安全设置进行配置,键入命令 sudo mysql_secure_installation 键入当前密码,当前没有,直接回车,之后跟随提示会问几个问题:设置 root 密码? / 移 ...

  10. Nginx学习——Nginx启动、停止、重启和信号控制以及平滑升级

    1.Nginx 启动与停止 (1)启动方式 启动格式:Nginx可执行文件地址 -c Nginx配置文件地址 /etc/local/nginx/sbin/nginx -c /root/dufy/ngi ...