Java带缓存的单向链表-线程安全

开发原因

ArrayList太重,线程还不安全
在一些队列处理的时候,ArrayList有点麻烦,还比较占内存,还没缓存,又得再加个缓存队列
所以就开发了这个
轻量级,线程安全,带缓存!nice!!

源码

package com.geom.queue;public class SinglyLinked<T>
{private Object _lock = new Object();private int _length = 0;private SinglyLinkedNode<T> _head = new SinglyLinkedNode<T>();private SinglyLinkedNode<T> _end = null;private int _cacheMax = 0;private SinglyLinked<Object> _cache = null;public SinglyLinked(){}/*** 0表示不缓存SinglyLinkedNode* @param cacheMax*/public SinglyLinked(int cacheMax){_cacheMax = cacheMax;if(_cacheMax > 0){_cache = new SinglyLinked<Object>();}}public int length(){return _length;}@SuppressWarnings("unchecked")public void push( T value ){SinglyLinkedNode<T> node = null;if( _cache != null ){Object obj = _cache.pop();if( obj != null ) node = (SinglyLinkedNode<T>)obj;}if( node==null ) node = new SinglyLinkedNode<T>();node.value = value;node.next = null;synchronized (_lock){if(_end==null)_head.next = node;else _end.next = node;_end = node;_length++;}}public T pop(){synchronized (_lock){if( _head.next != null ){T v = _head.next.value;if( _head.next==_end ){_end = null; //防止尾巴自己成一个链表}if( _cache != null ){if( _cache._length < _cacheMax ){_head.next.value = null;_cache.push(_head.next);}}_head.next = _head.next.next;_length--;return v;}}return null;}private SinglyLinkedNode<T> _current = null;public void resetFor(){synchronized (_lock){_current = _head.next;}}/*** 跟resetFor一起使用* @return*/public T next(){synchronized (_lock){if( _current != null ){T v = _current.value;_current = _current.next;return v;}}return null;}private static class SinglyLinkedNode<T>{SinglyLinkedNode<T> next = null;public T value = null;public SinglyLinkedNode(){}}
}

测试代码

public static void main(String[] args)
{SinglyLinked<Integer> link = new SinglyLinked<Integer>(10);link.push(1);link.push(2);link.resetFor();Integer v;while( (v = link.next()) != null ){System.out.println(v);}new Thread(new Runnable(){private int _v = 0;@Overridepublic void run(){while(true){link.push(_v++);try{Thread.sleep(1);} catch (InterruptedException e){e.printStackTrace();}}}}).start();new Thread(new Runnable(){@Overridepublic void run(){while(true){System.out.println(link.length() + ": " + link.pop());try{Thread.sleep(1);} catch (InterruptedException e){e.printStackTrace();}}}}).start();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch:相关性工作台 - BM25 及 ELSER 的相关性比较

我们知道 Elastics Learned Sparse EncoderR (ELSER) 可以被用来做语义搜索。它是一个 out-of-domain 的语义搜索模型。无需训练&#xff0c;我们就可以得到很好的相关性。有关 ELSER 的更多知识&#xff0c;请参考文章 “Elastic Learned Sparse Encoder 简介&#xff1a;Elas…

Mac下ERROR: Cannot connect to the Docker daemon

解决Mac下ERROR: Cannot connect to the Docker daemon at unix:///Users/qq/.orbstack/run/docker.sock. Is the docker daemon running? 在Mac系统的中, 如果实际已经安装docker并且已经启动了. 但执行 docker info 时 报错: ERROR: Cannot connect to the Docker daemon …

SpringMVC映射请求数据

1、获取超链接的参数和值 <a href"vote/vote01?namelove">获取超链接的参数</a> //获取超链接的参数RequestMapping(value "/vote01")public String vote01(RequestParam(value "name", requiredfalse) String name){System.out…

4-Docker命令之docker cp

1.docker cp介绍 docker cp命令是用于在本地宿主机文件系统与docker容器(状态:运行中/停止)之间复制文件或文件夹 2.docker cp用法 docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH [root@centos79 ~]# docker …

如何使用PHP进行数据加密和解密?

在 PHP 中&#xff0c;你可以使用加密算法和相关的扩展库来进行数据加密和解密。以下是使用 PHP 进行数据加密和解密的基本示例&#xff1a; 使用 OpenSSL 扩展进行加密和解密&#xff1a; 加密&#xff1a; <?php $data "Hello, World!"; $key openssl_rando…

jenkins-Generic Webhook Trigger指定分支构建

文章目录 1 需求分析1.1 关键词 : 2、webhooks 是什么&#xff1f;3、配置步骤3.1 github 里需要的仓库配置&#xff1a;3.2 jenkins 的主要配置3.3 option filter配置用于匹配目标分支 实现指定分支构建 1 需求分析 一个项目一般会开多个分支进行开发&#xff0c;测试&#x…

网络入门---可变参数原理和日志模拟实现

目录标题 前言有关函数的几个性质介绍可变参数的用法介绍可变参数的一个注意事项可变参数的底层原理va_listva_endva_startva_arg_INTSIZEOF 可变参数的注意事项日志的实现日志的测试 前言 在上一篇文章中我们介绍了TCP协议有关的函数&#xff0c;大致就是服务端先通过listen函…

oracle 如何把数据库 date 日期格式 的数据 改成 2021-01-27

如果您要将日期"27-12月-29"更改为"2021-01-27"格式&#xff0c;您可以使用Oracle的日期格式化函数和字符串替换函数来实现。 以下是一个示例SQL语句&#xff0c;将日期"27-12月-29"更改为"2021-01-27"格式&#xff1a; sql UPDATE…

Springboot的火车票订票系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; Springboot的火车票订票系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#…

C_13练习题答案

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上 以下叙述不正确的是(C)。A.C程序中,语句之间必须用分号分隔。 B.C程序中,多行语句可以写在一行上。 C.C程序中,可以不必包…

通过对象轮换实现 LRU 缓存结构

文章目录 通过两个对象轮换&#xff0c;按照是否访问实现内容长久保存rollup 的缓存实现 export default function (max) { //max 缓存容量var num, curr, prev;var limit max || 1;function keep(key, value) {if (num > limit) {prev curr; // 超过容量时当前对象变成缓…

什么是供应链安全及其工作原理?

6000公里长的丝绸之路将丝绸、谷物和其他货物从中国运送到帕尔米拉。尽管蒙古治下的和平保护丝绸之路免受海盗、强盗和内部盗窃的侵害&#xff0c;但商人仍然装备精良&#xff0c;并依赖于大型商队旅行和战略性放置的小型堡垒所提供的安全。 为什么供应链安全很重要&#xff1…

AE-制作科技感穿梭隧道

目录 1.新建合成命名为隧道 2.在合成中新建纯色层命名为五边形隧道

代码随想录刷题题Day14

刷题的第十四天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day14 任务 ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和 1 平衡二叉树 二叉树节点的深度&#xff1a;指从根节…

Unity项目优化案例二

本文地址&#xff1a;https://blog.csdn.net/t163361/article/details/135024136 针对工作中遇到的优化问题&#xff0c;记录一下&#xff0c;给大家优化自己的项目提供一些思路。 公司产品最近正给国内某大型赛事做支撑服务暴露出不少问题。 使用环境 Unity 2021.3.0f1 cpu…

新手HTML和CSS的常见知识点

​​​​ 目录 1.HTML标题标签&#xff08;到&#xff09;用于定义网页中的标题&#xff0c;并按照重要性递减排列。例如&#xff1a; 2.HTML段落标签&#xff08;&#xff09;用于定义网页中的段落。例如&#xff1a; 3.HTML链接标签&#xff08;&#xff09;用于创建链接…

报错Cannot read property delayMs of null;【Bug已解决-鸿蒙应用开发】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结附录-相关知识鸿蒙应用开发优势鸿蒙操作系统应用场景项目场景: 应用开发时报错: Cannot read property delayMs of null; 分析一下是什么错误原因导致的?下文详细描述 问题描述 相关问题: 应用开发时…

【字节笔试题】大小为n的数组中有多少个连续子数组满足该子数组所有元素的乘积是k的倍数?

题目描述 小红拿到了一个大小为n的数组&#xff0c;他想知道&#xff0c;有多少连续子数组满足&#xff0c;该子数组所有元素的乘积是k的倍数&#xff1f; 输入输出 第一行输入2个整数&#xff0c;分别是数组长度n和参数k 第二行输入n个元素的数组 n有10^5级别 数组元素有1…

2021年数维杯国际大学生数学建模A题新冠肺炎背景下港口资源优化配置策略求解全过程文档及程序

2021年数维杯国际大学生数学建模 A题 新冠肺炎背景下港口资源优化配置策略 原题再现&#xff1a; 2020年初&#xff0c;新型冠状病毒&#xff08;COVID-19&#xff09;在全球迅速蔓延。根据世界卫生组织2021年7月31日的报告&#xff0c;新冠病毒疫情对人类的影响可能比原先预…

Tomcat-安装部署(源码包安装)

一、简介 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#xff0c;Tomcat是一个WEB应用程序的托管平台…