基于AQS+双向链表实现队列先进先出
学习AQS写的一个模拟案例
package com.tom.xiangyun.ch04_aqs;import com.tom.tuling.UnsafeFactory;
import sun.misc.Unsafe;import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;/*** 使用双向链表实现队列** @author 钟棋炜* @date 2023-08-22 20:52*/
public class QueueDoubleLinked {private transient volatile Node head;private transient volatile Node tail;private static final Unsafe unsafe = UnsafeFactory.getUnsafe();private static final long headOffset;private static final long tailOffset;private static final long nextOffset;private final ReentrantLock takeLock = new ReentrantLock();private final AtomicInteger count = new AtomicInteger();static {try {assert unsafe != null;headOffset = unsafe.objectFieldOffset(QueueDoubleLinked.class.getDeclaredField("head"));tailOffset = unsafe.objectFieldOffset(QueueDoubleLinked.class.getDeclaredField("tail"));nextOffset = unsafe.objectFieldOffset(Node.class.getDeclaredField("next"));} catch (Exception ex) {throw new Error(ex);}}public QueueDoubleLinked() {}private boolean compareAndSetHead(Node update) {return unsafe.compareAndSwapObject(this, headOffset, null, update);}private boolean compareAndSetTail(Node expect, Node update) {return unsafe.compareAndSwapObject(this, tailOffset, expect, update);}//入队public String add(String element) {Node node = new Node(element);enq(node);return element;}//出队 先进public Object poll() {final AtomicInteger count = this.count;if (count.get() == 0) {return null;}Object x = null;final ReentrantLock takeLock = this.takeLock;takeLock.lock();try {if (count.get() > 0) {x = dequeue();count.getAndDecrement();}} finally {takeLock.unlock();}return x;}private Object dequeue() {Node h = head;Node first = head.next;h.next = h;head = first;Object obj = first.data;first.data = null;return obj;}private Node enq(final Node node) {//尾插法final AtomicInteger count = this.count;for (; ; ) {Node t = tail;if (t == null) {if (compareAndSetHead(new Node())) {tail = head;}} else {node.prev = t;if (compareAndSetTail(t, node)) {t.next = node;count.getAndIncrement();return t;}}}}static final class Node {Node prev;//前置节点Node next;//后置节点Object data; //存放数据public Node() {}public Node(Object data) {this.data = data;}}public static void main(String[] args) {QueueDoubleLinked queue = new QueueDoubleLinked();queue.add("tom");queue.add("no");queue.add("xx");queue.add("zz");System.out.println(queue.poll());System.out.println(queue.poll());System.out.println(queue.poll());System.out.println(queue.poll());System.out.println(queue);}
}
相关文章:
基于AQS+双向链表实现队列先进先出
学习AQS写的一个模拟案例 package com.tom.xiangyun.ch04_aqs;import com.tom.tuling.UnsafeFactory; import sun.misc.Unsafe;import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantLock;/*** 使用双向链表实现队列** author 钟棋…...
无涯教程-Perl - time函数
描述 此函数返回自纪元以来的秒数(对于大多数系统,是1970年1月1日UTC,00:00:00;对于Mac OS,是1904年1月1日,00:00:00)。适用于gmtime和本地时间。 语法 以下是此函数的简单语法- time返回值 此函数返回自纪元后数秒的整数。 例 以下是显示其基本用法的示例代…...
CUDA Bug<三>当__global__函数出现里面所有输出的数组都随机赋值了
问题具体描述: eg. __global__ void Updata_HomJm(float* H,float *HJm,float* fr,float *gr,float* ur,float* urgrJm,float*wpd,float *w, float *wJm,int n) { int idx blockIdx.x*blockDim.x threadIdx.x;float t 0.0;//H*zpint idx_Ai idx*n;for (int j…...
甜椒叶病害识别(Python代码,pyTorch框架,深度卷积网络模型,很容易替换为其它模型,带有GUI识别界面)
代码运行要求:Torch>1.13.1即可 1.数据集介绍: 第一个文件夹是细菌斑叶(3460张) 第二个文件夹是 健康(4024张) 2.整个文件夹 data文件夹存放的是未被划分训练集和测试集的原始照片 picture文件夹存放的…...
Python爬虫——scrapy_日志信息以及日志级别
日志级别(由高到低) CRITICAL: 严重错误 ERROR: 一般错误 WARNING: 警告 INFO: 一般警告 DEBUG: 调试信息 默认的日志等级是DEBUG 只要出现了DEBUG或者DEBUG以上等级的日志,那么这些…...
微信小程序 echarts 画多个横向柱状图
然后是json {"usingComponents": {"ec-canvas": "../../common/ec-canvas/ec-canvas"},"navigationBarTitleText": "主题活动" } ec-canvas获取方式 在链接里下载代码 然后copy ec-canvas文件夹到自己的项目 https://gi…...
【二叉树】572. 另一棵树的子树
572. 另一棵树的子树 解题思路 遍历二叉树的思路针对每一个节点判断该节点的子树和subtree是不是相等需要编写判断两个子树是否相等的函数 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* …...
220V转5V芯片三脚芯片-AH8652
220V转5V芯片三脚芯片是一种非常常见的电源管理芯片,它通常被用于将高压交流输入转为稳定的直流5V输出。芯片型号AH8652是一款支持交流40V-265V输入范围的芯片,采用了SOT23-3三脚封装。该芯片内部集成了650V高压MOS管,能够稳定地将输入电压转…...
windows系统丢失mfc120u.dll的解决方法
1.mfc120u.dll是什么 mfc120u.dll是Windows操作系统中的一个动态链接库(Dynamic Link Library,简称DLL)文件。它包含了一些用于运行C程序的函数和其他资源。这个特定的DLL文件是Microsoft Foundation Classes(MFC)库的…...
css 实现电梯导航
实现原理:利用css实现电梯导航很简单,基本原理就是通过a标签绑定跳转目标的id来实现的 html代码: <div class"body"><div class"top" id"top"></div><div class"con1" id"…...
【Spring Boot】Spring Retry减少1000 行代码讲解
文章目录 前言问题介绍解决方案Let’s start hacking!1. 设置 Spring 重试2. 重构代码 总结 前言 本文翻译自国外论坛 medium,原文地址:levelup.gitconnected.com/how-i-delet…,原文作者:Hari Ohm Prasath 使用 Spring Retry 重…...
【数据结构OJ题】相交链表
原题链接:https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 看到这道题,很容易想到的方法就是暴力求解,就是将一个链表的每个结点的地址…...
【华为OD机试】最小传输时延I【2023 B卷|200分】
【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 某通信网络中有N个网络结点,用1到N进行标识。网络通过一个有向无环图表示, 其中图的边的值表示结点之间的消息传递时延。 现给定相连节点之间的时延列表times[i]={u,v,w},其中u表示…...
Android13 网络 Adb 默认开启
Android 13 网络 Adb 默认开启 文章目录 Android 13 网络 Adb 默认开启一、前言二、默认adb 代码实现1、修改的目录:2、具体修改:(1)在XXX_device.mk 添加属性(2)设置固定端口号(3)去…...
Git分享-规范/建议/技巧
1. Git多人协作开发流程图 1.1 processOn默认的模板 1.2 改造之后 https://www.processon.com/view/link/64ccaf56a433c931b2f9428a 访问密码:512I ① 总流程图 ② feat分支(功能/需求 分支)流程 ③ bugfix分支(紧急补丁分支&…...
vue3文件下载功能
定义方法: utils.js /**** param url 目标下载接口* param query 查询参数* param fileName 文件名称* returns {*}*/ export function downBlobFile(url: any, query: any, fileName: string) {return request({//url: url,method: get,responseType: blob,param…...
Python调用文心一言的API
最近申请了文心一言的key,然后尝试调用了一下文心一言,这里使用一个简单的方式来调用文心一言: pip install paddle-pipelinesfrom pipelines.nodes import ErnieBotapi_key "your apply key" secret_key "your apply secr…...
【计算机网络八股】计算机网络(一)
目录 计算机网络的各层协议及作用?TCP和UDP的区别?UDP 和 TCP 对应的应用场景是什么?详细介绍一下 TCP 的三次握手机制?为什么需要三次握手,而不是两次?为什么要三次握手,而不是四次?…...
记录一次arcgis engine开发版本引入问题
之前基于arcigs 10.1vs2013开发的程序,现在拿出来要改,但是目前版本是arcgis10.7vs2017/vs2019,打开后无论如何替换引用版本,都报错 (具体版本对应可以看这:ArcGIS Engine 与 Visual Studio 版本对照表_vs2019对应啥版…...
2023年Java毕业设计怎样选题,有哪些注意事项,300道Java毕业设计题目
文章目录 一、确定个人兴趣和技能二、考虑实际应用价值三、注重创新和独特性四、合理规划时间和资源五、注重实践和测试Java 毕业设计题目参考第一部分第二部分 小结 随着计算机技术的不断发展,Java编程语言已经成为了众多大学计算机专业学生必修的一门课程。而Java…...
Acode:重新定义Android移动代码编辑体验
Acode:重新定义Android移动代码编辑体验 【免费下载链接】Acode Acode - powerful text/code editor for android 项目地址: https://gitcode.com/gh_mirrors/ac/Acode 在移动开发日益普及的今天,拥有一款高效的移动代码编辑器成为开发者的迫切需…...
macOS效率革命:3个全局快捷键让Finder目录操作提速300%
macOS效率革命:3个全局快捷键让Finder目录操作提速300% 【免费下载链接】OpenInTerminal ✨ Finder Toolbar app for macOS to open the current directory in Terminal, iTerm, Hyper or Alacritty. 项目地址: https://gitcode.com/gh_mirrors/op/OpenInTerminal…...
避坑指南:思科模拟器做链路聚合时,你可能会遇到的5个报错及解决方法
思科模拟器链路聚合实战:5个典型报错分析与精准排错指南 在Packet Tracer中配置链路聚合时,最令人头疼的往往不是基础配置步骤,而是那些突如其来的报错信息。上周有位学员在CCNA备考群里发了一张截图:%EC-5-CANNOT_BUNDLE2: Fa0/2…...
QT6在Ubuntu20.4上的避坑指南:为什么你的安装总是失败?
QT6在Ubuntu 20.04上的避坑指南:从依赖缺失到环境配置的深度解析 Ubuntu 20.04作为长期支持版本,至今仍是许多开发者的首选系统。然而当你想在这个稳定版本上安装QT6时,可能会遇到各种意想不到的问题——从依赖库冲突到权限错误,从…...
Druid监控界面安全加固实战:从暴露风险到生产级防护
1. Druid监控界面暴露风险全景扫描 上周帮客户做安全审计时,发现他们的订单系统监控页面居然能直接通过公网IP访问,打开/druid/index.html就能看到所有SQL执行记录和会话信息。这种场景太典型了——很多团队在开发阶段为了方便调试,把Druid监…...
Windows系统优化终极指南:AtlasOS完整解决方案深度解析
Windows系统优化终极指南:AtlasOS完整解决方案深度解析 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atla…...
从‘碎饼干’到‘稳如狗’:机器视觉定位项目避坑指南与SAME原则实战
从‘碎饼干’到‘稳如狗’:机器视觉定位项目避坑指南与SAME原则实战 去年接手某食品包装线改造项目时,产线主管指着满地饼干碎屑苦笑道:"这哪是智能生产线,简直是饼干粉碎机。"这个价值两百万的视觉定位系统,…...
大模型核心技术概述:Token、Prompt、Tool与Agent的关系详解
你是不是经常听人聊AI时蹦出这些词:LLM、Token、Context、Prompt、Tool、MCP、Agent?听着好像都认识,但真要问“这到底是啥”,又有点懵。今天把这些词一个个拆开揉碎,讲清楚它们到底是啥、有啥用、又是怎么串起来的。 …...
OpenCascade避坑指南:BRepMesh网格生成常见的5个问题与解决方法(含性能对比数据)
OpenCascade网格生成实战:5个高频问题深度解析与性能优化指南 当你在CAD开发中第一次调用BRepMesh_IncrementalMesh时,是否遇到过网格生成失败却找不到原因的情况?或是面对复杂模型时性能急剧下降的困境?这些问题往往让初学者束手…...
Python自动化办公:3种绕过VBA宏直接操作Word目录的实战方法(附完整代码)
Python自动化办公:3种绕过VBA宏直接操作Word目录的实战方法 在数字化转型浪潮中,企业文档处理正面临前所未有的效率挑战。当我们需要批量更新数百份Word文档的目录时,传统VBA宏方案常因安全警告、格式限制和跨平台兼容性问题而举步维艰。本文…...
