最近在维护一些C# 2.0的代码....发现各种线程不安全的实现

2.0里面又没有ConcurrentCollection的相关类

不得已,自己写了一个,

本来想用传统的lock实现的, 不过考虑到其中的操作非常轻量级...最终还是用了Lock Free

使用原子操作 InterLocked 替换掉常用的lock关键字

    public sealed class SafedQueue<T>    {#region private Fieldsprivate int isTaked = 0;private Queue<T> queue = new Queue<T>();private int MaxCount = 1000 * 1000;#endregion

public void Enqueue(T t)        {try            {while (Interlocked.Exchange(ref isTaked, 1) != 0)                {                }this.queue.Enqueue(t);            }finally            {                Thread.VolatileWrite(ref isTaked, 0);            }        }

public T Dequeue()        {try            {while (Interlocked.Exchange(ref isTaked, 1) != 0)                {                }                T t = this.queue.Dequeue();return t;            }finally            {                Thread.VolatileWrite(ref isTaked, 0);            }        }

public bool TryEnqueue(T t)        {try            {for (int i = 0; i < MaxCount; i++)                {if (Interlocked.Exchange(ref isTaked, 1) == 0)                    {this.queue.Enqueue(t);return true;                    }                }return false;            }finally            {                Thread.VolatileWrite(ref isTaked, 0);            }        }

public bool TryDequeue(out T t)        {try            {for (int i = 0; i < MaxCount; i++)                {if (Interlocked.Exchange(ref isTaked, 1) == 0)                    {                        t = this.queue.Dequeue();return true;                    }                }                t = default(T);return false;            }finally            {                Thread.VolatileWrite(ref isTaked, 0);            }        }    }

Try起头的方法都有尝试次数限制,超过限制以后就退出并返回false

转载于:https://www.cnblogs.com/PurpleTide/archive/2012/03/18/2404608.html

轻量级 Lock Free 线程安全的 QueueT 的C#2.0实现相关推荐

  1. educoder 使用线程锁(lock)实现线程同步_性能:Lock的锁之优化

    Lock / synchronized Lock锁的基本操作是通过乐观锁实现的,由于Lock锁也会在阻塞时被挂起,依然属于悲观锁 synchronizedLock实现方式JVM层实现Java底层代码实 ...

  2. educoder 使用线程锁(lock)实现线程同步_Python并行编程(二):多线程锁机制利用Lock与RLock实现线程同步

    什么是锁机制? 要回答这个问题,我们需要知道为什么需要使用锁机制.前面我们谈到一个进程内的多个线程的某些资源是共享的,这也是线程的一大优势,但是也随之带来一个问题,即当两个及两个以上的线程同时访问共享 ...

  3. 使用lock同步线程,建立了10个线程实例

    在C#中处理同步 过对指定对象的加锁和解锁可以实现同步代码段的访问. 在.NET的System.Threading命名空间中提供了Monitor类来实现加锁与解锁.该类中的方法都是静态的. 如下表: ...

  4. 创建线程(Lock()、线程池、Callable())及线程通信

    package com.xt.java;import java.util.concurrent.locks.ReentrantLock;/*** 解决线程安全问题的方式三:Lock锁 -->JD ...

  5. 使用线程锁(lock)实现线程同步_一文搞懂Java多线程使用方式、实现原理以及常见面试题...

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  6. educoder 使用线程锁(lock)实现线程同步_线程间的通信(一)

    这篇文章主要从4个角度来讲多线程间的通信: 使用wait/notify实现线程间的通信 生产者/消费者模式的实现 方法join的使用 ThreadLocal类的使用 等待/通知机制的实现: (1)wa ...

  7. 《JUC并发编程 - 基础篇》JUC概述 | Lock接口 | 线程间通信 | 多线程锁 | 集合线程安全

  8. 多线程随机数组生成+双线程快速排序(C++实现)(0.2秒排100W个数字)

    简述 用很多个线程进行随机数的生成 用两个线程来进行数组的排序 基于的算法是快速排序算法. 基本可以做到 0.2秒左右的时间排完100W个数字 #include <iostream> us ...

  9. java sleep的意义_java 线程Thread.Sleep详解 Thread.Sleep(0)的作用

    我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢? 思考下面这两个问题: 1.假设现在是 2008-4-7 12:00:00.000,如果 ...

最新文章

  1. linux下batik-rasterizer.jar生成图片中文乱码
  2. 【盘点】北美顶尖学府的人工智能与智能车实验室
  3. c/c++中运行外部程序
  4. web python php golang_python go 语言完成最简单的web应用
  5. shiro学习(19): 拦截器
  6. 重磅!GitHub发布年度机器学习榜:TensorFlow最火,PyTorch消失!
  7. python原类、类的创建过程与方法
  8. ApacheCN C/C++ 译文集(二) 20211204 更新
  9. mongo报错WiredTiger.wt, connection: /data/db/WiredTiger.wt: handle-open: open: Operation not permitted
  10. linux 下nginx应用场景的tcp内核调优
  11. Bootstrap 模态对话框只加载一次 remote 数据的解决办法 转载
  12. python猜数字游戏_C++编程基础: 9. 猜数字小游戏
  13. HA模式下的java api访问要点
  14. python 安装impala包
  15. 工作流框架的设计要点
  16. 子龙山人:我从Cocos2d-x团队里学到的
  17. 英雄联盟祖安服务器要维护多久,英雄联盟祖安大区到底有多凶残?手速慢了必然赢不了对面!...
  18. 思科计算机基础知识,思科路由器基础知识--存储详解
  19. View与ViewGroup
  20. 从实验室研发到大规模生产 纳晶科技量子点技术商用多点开花

热门文章

  1. 手工收集awr报告_一个Oracle小白的AWR报告分析(一)
  2. 74ls390设计任意进制计数器_利用数字频率合成技术设计高速任意波形发生器(上)...
  3. php 标签库,PHP.MVC的模板标签系统之模板标签库
  4. 修改sql服务器排序规则,SQL SERVER数据库服务器排序规则修改
  5. ViewData 和TempData ,Session用法
  6. mysql ken len_MySQL EXPLAIN
  7. jenkins修改pom文件_从Jenkins中的pom文件自动派生强制性SonarQube属性
  8. js读取html元素scr,了解一下JavaScript中的DOM编程
  9. java 数据抓取 动态获得cookies里变动的属性_@CookieValue获取Cookie信息,使用Servlet API作为入参,处理模型数据...
  10. 为什么薄膜干涉的厚度要很小_薄膜干涉的膜为什么不能太厚?