当前位置: 首页 > news >正文

【Java】使用VarHandler实现无锁Stack

一,概述

java.utils中Stack,本身继承Vector,而Vector部分方法使用synchronized方法加锁,导致Stack本身操作也是加锁操作,相对来说还是有性能开销的。那么怎么实现轻量级无锁且安全的Stack?可以借助VarHandler原子操作实现。仅供参考,其它高性能数据结构优化可参考。

二,实现

import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
import java.util.NoSuchElementException;public class StackWithoutLock<T> {private static final VarHandle TAIL;static {MethodHandles.Lookup l = MethodHandles.lookup();try {TAIL = l.findVarHandle(StackWithoutLock.class, "tail", Node.class);} catch (NoSuchFieldException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}private final Node<T> HEAD = new Node<>();private int size;private Node<T> tail = HEAD;public void push(T t) {Node<T> oldTail = tail;Node<T> newNode = new Node<>();newNode.value = t;while (!TAIL.compareAndSet(this, oldTail, newNode)) {oldTail = tail;}oldTail.next = newNode;newNode.pre = oldTail;size++;}public T pop() {if (tail == HEAD) {throw new NoSuchElementException("stack empty!");}Node<T> oldTail = tail;Node<T> newTail = tail.pre;while (!TAIL.compareAndSet(this, tail, newTail)) {oldTail = tail;newTail = tail.pre;}size--;return oldTail.value;}public T peek() {if (tail == HEAD) {throw new NoSuchElementException("stack empty!");}return tail.value;}public boolean isEmpty() {return size == 0;}}private static class Node<T> {T value;Node<T> next;Node<T> pre;}
}

三,效果

public static void main(String[] args) {StackWithoutLock<Integer> stack1 = new StackWithoutLock<>();for (int i = 0; i < 5; i++) {stack1.push(i);System.out.println(stack1.peek() + "   size=" + stack1.size);}while (!stack1.isEmpty()) {Integer pop = stack1.pop();System.out.println("pop " + pop + " size=" + stack1.size);}}

相关文章:

  • 具备强大的数据处理和分析能力的智慧地产开源了
  • 测试开发笔试题 Python 字符串中提取数字
  • C++ 使用 ffmpeg 解码 rtsp 流并获取每帧的YUV数据
  • [特殊字符] FFmpeg 学习笔记
  • 三角形类CTriangle
  • 使用qt 定义全局钩子 捕获系统的键盘事件
  • ApacheSuperset CVE-2023-27524
  • 《短线追涨与低吸技术》速读笔记
  • Java 二维码
  • Web开发主流前后端框架总结
  • (eNSP)配置WDS手拉手业务
  • 激光干涉仪:解锁协作机器人DD马达的精度密码
  • Vue3基础
  • 自动化测试工具playwright中文文档-------18.模拟
  • 解决el-cascader组件下拉选项过长,数据回显无法换行显示的问题
  • 【计算机网络】第3章:传输层—TCP 拥塞控制
  • Bootstrap 5学习教程,从入门到精通,Bootstrap 5 容器(Container)语法知识点及案例代码详解(4)
  • matlab模糊控制实现路径规划
  • haribote原型系统改进方向
  • 153页PPT麦肯锡咨询流程管理及企业五年发展布局构想与路径规划
  • 建立一个购物网站/seo网站推广收费
  • 上海第五届世界进口博览会/seo关键词推广
  • 国外做网站的软件/广告主广告商对接平台
  • 简单手机网站如何制作/上海做推广的引流公司
  • 做爰的细节描述和过程网站/seo服务哪家好
  • 做鞋子批发网站有哪些/个人博客模板