当前位置: 首页 > 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);}}

http://www.dtcms.com/a/231394.html

相关文章:

  • 具备强大的数据处理和分析能力的智慧地产开源了
  • 测试开发笔试题 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麦肯锡咨询流程管理及企业五年发展布局构想与路径规划
  • Spring AI 项目实战(五):Spring Boot + AI + DeepSeek + Redis 实现聊天应用上下文记忆功能(附完整源码)
  • 通光散基因组-文献精读139
  • Mask篇 (含引导层、不规则遮罩)
  • 2025 Vscode插件离线下载方式
  • sql入门语句-案例
  • 【YOLOs-CPP-图像分类部署】04-项目优化(加速部署)
  • 网络编程之网络基础
  • C++ 新特性详解:Lambda 表达式全解析(含实战案例)
  • 概念全解析:结构化数据,半结构化数据,非结构化数据分别是什么意思?
  • 软珊瑚成分 CI-A:靶向口腔癌细胞的 “氧化利剑” 与 ERK 密码