标签:static 默认 new 基于 otn turn 原子类 log 返回
众所周知,java1.5并发包通过volatile+CAS原理提供了优雅的并发支持。今天仔细想想.net也有volatile关键字保证内存的可见性,同时也有Interlocked提供了CAS的API,因此突发奇想——对着java并发包写一下.net并发包。第一步就是原子类型的实现(.NET目前还没有原子类型)
项目地址:https://github.com/FanHuaRan/Dotnet.Concurrent
/// <summary> /// 原子int 基于CAS+自旋无锁化编程实现,核心Interlocked /// 2017/10/18 fhr /// </summary> public class AtomicInteger { /// <summary> /// 缺省默认值 /// </summary> private static readonly int DEFAULT_INITAL_VALUE=0; /// <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)-1; } /// <summary> /// 自减一,返回新值 /// </summary> /// <returns></returns> public int DecrementAndGet() { return Interlocked.Decrement(ref value); } /// <summary> /// 自减一,返回旧值 /// </summary> /// <returns></returns> public int GetAndDecrement() { return Interlocked.Decrement(ref value)+1; } /// <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(); } }
/// <summary> /// 原子long 基于CAS+自旋无锁化编程实现,核心Interlocked /// 2017/10/18 fhr /// </summary> public class AtomicLong { /// <summary> /// 缺省默认值 /// </summary> private static readonly long DEFAULT_LONG_VALUE=0; /// <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)-1; } /// <summary> /// 自减一,返回新值 /// </summary> /// <returns></returns> public long DecrementAndGet() { return Interlocked.Decrement(ref value); } /// <summary> /// 自减一,返回旧值 /// </summary> /// <returns></returns> public long GetAndDecrement() { return Interlocked.Decrement(ref value)+1; } /// <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(); } }
/// <summary> /// 原子Boolean 基于CAS+自旋无锁化编程实现,核心Interlocked /// 2017/10/18 fhr /// </summary> public class AtomicBoolean { private static readonly int TRUE_INT = 1; private static readonly int FALSE_INT = 0; /// <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
标签:static 默认 new 基于 otn turn 原子类 log 返回
原文地址:http://www.cnblogs.com/Huaran1chendu/p/7689484.html