对着java并发包写.net并发包之原子类型实现
众所周知,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并发包之原子类型实现的更多相关文章
- c++ c# java 调用 c++ 写的dll
1. vs 中新建win32 dll 项目 testdll 添加实现文件 test.cpp #include "stdafx.h" #include <ios ...
- Java自己动手写连接池四
Java自己动手写连接池四 测试: package com.kama.cn; import java.sql.Connection; public class Test { public static ...
- Java自己动手写连接池三
Java自己动手写连接池三,核心代码; package com.kama.cn; import java.sql.Connection;import java.util.ArrayList;impor ...
- Java将数据写进excel
Java将数据写进excel Java将数据写进excel class User { private String name ; private String password; public Use ...
- 优秀 Java 程序员写代码的风格,不再留坑给别人
往 期 精 彩 推 荐 [1]Java Web技术经验总结 [2]15个顶级Java多线程面试题及答案,快来看看吧 [3]面试官最喜欢问的十道java面试题 [4]从零讲JAVA ,给你一条清晰 ...
- 优秀 Java 程序员写代码的风格
往 期 精 彩 推 荐 [1]Java Web技术经验总结 [2]15个顶级Java多线程面试题及答案,快来看看吧 [3]面试官最喜欢问的十道java面试题 [4]从零讲JAVA ,给你一条清晰 ...
- 【转载】java调用C++写的DLL
用java调用C++写的DLL一直以来都是一个比较麻烦但又很常见的问题. 我们知道,使用 JNI 调用 .dll/.so 共享类库是非常非常麻烦和痛苦的. 如果有一个现有的 .dll/.so 文件,如 ...
- JAVA一个文件写多个类
JAVA一个文件写多个类,并且是同级类,需注意: 在一个.java文件中可以有多个同级类, 其修饰符只可以public/abstract/final/和无修饰符 public修饰的只能有一个,且必须 ...
- java 从零开始手写 RPC (03) 如何实现客户端调用服务端?
说明 java 从零开始手写 RPC (01) 基于 socket 实现 java 从零开始手写 RPC (02)-netty4 实现客户端和服务端 写完了客户端和服务端,那么如何实现客户端和服务端的 ...
随机推荐
- 【1414软工助教】团队作业7——Alpha冲刺之事后诸葛亮 得分榜
题目 团队作业7--Alpha冲刺之事后诸葛亮 往期成绩 个人作业1:四则运算控制台 结对项目1:GUI 个人作业2:案例分析 结对项目2:单元测试 团队作业1:团队展示 团队作业2:需求分析& ...
- Swing-JComboBox用法-入门
JComboBox是Swing中的下拉菜单控件.它永远只能选中一个项目,然而比单选按钮节省空间.如果使用setEditable设置为true则内部选项的文本可以编辑,因此这种组件被称为组合框.注意,对 ...
- 201521123122 《java程序设计》 第三周学习总结
1. 本章学习总结 你对于本章知识的学习总结 链接点击此处 2. 书面作业 代码阅读 public class Test1 { private int i = 1;//这行不能修改 private s ...
- 201521123028《Java程序设计》第1周学习总结
1. 本周学习总结 通过本周的学习: 1.了解了Java的发展史(从OAK转向Internet,并逐步发展至今的历程) 2.与C语言比较,Java语言的特点: ①将源程序编译成一种结构中立的中间文件格 ...
- PTA中提交Java程序的一些套路
201708新版改版说明 PTA与2017年8月已升级成新版,域名改为https://pintia.cn/,官方建议使用Firefox与Chrome浏览器. 旧版 PTA 用户首次在新版系统登录时,请 ...
- 201521123039《java程序设计》第十四周学习总结
1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 在自己建立的数据库上执行常见SQL语句(截图) 2 ...
- 201521123042《Java程序设计》第13周学习总结
本次作业参考文件 正则表达式参考资料 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.bai ...
- 201521123032 《Java程序设计》第13周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...
- 201521123074 《Java程序设计》第11周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 Q1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...
- Ajax跨域问题的出现和解决
什么是跨域? 1).请求是执行过去了,但是响应的数据拿不到 2).浏览器有一个安全限制叫同源策略(针对ajax请求): 从http://localhost:80/member/apply.html页面 ...