单线程无锁读写缓存
来源:互联网 发布:淘宝上冰毒暗语 编辑:程序博客网 时间:2024/06/06 16:59
import java.util.Arrays;/** * 创建一个循环队列(环形缓冲、RingBuffer),实际元素存在一个数组中,操作数组的指针,不移动元素 * <p/> * 需要说明是:支持单线程无锁读与写 */public class CircleQueue<T>{ // 循环队列 (数组)默认大小 private final int DEFAULT_SIZE = 1000; // (循环队列)数组的容量 public int capacity; // 数组:保存循环队列的元素 public Object[] elementData; // 队头(先见先出) public int head = 0; // 队尾 public int tail = 0; // 以循环队列 默认大小创建空循环队列 public CircleQueue() { capacity = DEFAULT_SIZE; elementData = new Object[capacity]; } public CircleQueue(final int initSize) { capacity = initSize; elementData = new Object[capacity]; } /** * 获取循环队列的大小(包含元素的个数) */ public int size() { if (isEmpty()) { return 0; } else if (isFull()) { return capacity; } else { return tail + 1; } } /** * 插入队尾一个元素 */ public void add(final T element) { if (isEmpty()) { elementData[0] = element; } else if (isFull()) { elementData[head] = element; head++; tail++; head = head == capacity ? 0 : head; tail = tail == capacity ? 0 : tail; } else { elementData[tail + 1] = element; tail++; } } public boolean isEmpty() { return tail == head && tail == 0 && elementData[tail] == null; } public boolean isFull() { return head != 0 && head - tail == 1 || head == 0 && tail == capacity - 1; } public void clear() { Arrays.fill(elementData, null); head = 0; tail = 0; } /** * @return 取 循环队列里的值(先进的index=0) */ public Object[] getQueue() { final Object[] elementDataSort = new Object[capacity]; final Object[] elementDataCopy = elementData.clone(); if (isEmpty()) { } else if (isFull()) { int indexMax = capacity; int indexSort = 0; for (int i = head; i < indexMax; ) { elementDataSort[indexSort] = elementDataCopy[i]; indexSort++; i++; if (i == capacity) { i = 0; indexMax = head; } } } else { // elementDataSort = elementDataCopy;//用这行代码代替下面的循环,在队列刚满时候会出错 for (int i = 0; i < tail; i++) { elementDataSort[i] = elementDataCopy[i]; } } return elementDataSort; } }
0 0
- 单线程无锁读写缓存
- java缓存用例(包含读写锁,单例)
- 使用RCU技术实现读写线程无锁
- 线程学习之读写锁模拟缓存系统
- 单线程代理无间隔抓取
- (9)java5的线程【锁lock】与【读写锁_以及模拟缓存(妙用)】技术
- (9)java5的线程【锁lock】与【读写锁_以及模拟缓存(妙用)】技术
- 线程高级---读写锁
- 线程ReadWriteLock 读写锁
- 线程读写锁
- 线程通信----读写锁
- java 线程读写锁
- 线程读写锁总结
- 线程与读写锁
- 线程同步-读写锁
- 无锁,线程安全,延迟加载的单例实现(C#)
- 黑马程序员——Java基础---线程的另一个总结(6)--线程读写锁,缓存小例子
- 读写锁实现缓存系统
- SQLAlchemy:python数据库连接 神器
- 3.MR输入格式和分片相关
- spfa ,就邻接表建图模板
- c++ 面向切面变成 aop 通用模板
- iOS-上传错误之ERROR ITMS-90535 Unexpected CFBundleExecutable Key. 的解决办法
- 单线程无锁读写缓存
- 创建显示对话框的DLL
- extjs 事件参数,不加,就要使用绝对引用
- 5.MR多文件的输入输出
- 理解jquery的$.extend()、$.fn和$.fn.extend()
- springMVC 返回类型选择 以及 SpringMVC中model,modelMap.request,session取值顺序
- 4.MR老版流程源码解析
- IOS 系统定位提示完毕后 提示用户去开启定位权限
- iOS项目中常用的第三方开源库