多线程环境下使用责任链,串链了

news2024/12/29 2:48:21

问题描述:

系统定义了一套校验链:链1,链2,,,链N;交由不同的业务初始化自定义的链结构。比如

业务a:定义的是链1、链3

业务b:定义的是链2、链4

结果:

业务a走的链成2、4了。

public abstract class CheckChain {
    protected CheckChain chain;

    public void setNextChain(CheckChain nextChain){
        this.chain = nextChain;
        if (null != nextChain){
            System.out.println(nextChain.getClass());
        }
    }

    public static class Builder{
        private CheckChain head;
        private CheckChain tail;

        public Builder addChain(CheckChain chain) {
            if (this.head == null) {
                this.head = this.tail = chain;
                return this;
            }
            this.tail.setNextChain(chain);
            this.tail = chain;
            return this;
        }

        public CheckChain build() {
            return this.head;
        }
    }

    public abstract boolean process(Object object);
    
}
@PostMapping(value = "testChain")
public void testChain(){
    System.out.println("===================链A");
    CheckChain chainA = new CheckChain.Builder().addChain(chain1).addChain(chain3).build();
    System.out.println("===================链B");
    CheckChain chainB = new CheckChain.Builder().addChain(chain1).addChain(chain4).build();
    
    System.out.println("chainA:"+System.identityHashCode(chainA));
    System.out.println("chainB:"+System.identityHashCode(chainB));
    System.out.println(chainA == chainB);
}

如上代码所示,定义了链A和链B,运行结果如下,chainA和chainB这2个变量,在内存中的地址引用是一样的,也就是这2个链,其实是一个对象。但是chainA定义的链1、3;chainB定义的链2、4,如果执行的话,最后链对象只能是链2、4了。

原因是创建的两个责任链对象时使用了构造者设计模式直接返回的责任链对象头结点对象地址,另外,在spring容器管理注入对象时,默认创建是单例对象。所以chainA和chainB会相等。

那怎样才能不会串链?那就别用spring的注入了,每次重新new对象吧。

@PostMapping(value = "testChain")
public void testChain(){
    System.out.println("===================链A");
    CheckChain chainA = new CheckChain.Builder().addChain(new Chain1()).addChain(new Chain3()).build();
    System.out.println("===================链B");
    CheckChain chainB = new CheckChain.Builder().addChain(new Chain1()).addChain(new Chain4()).build();
    
    System.out.println("chainA:"+System.identityHashCode(chainA));
    System.out.println("chainB:"+System.identityHashCode(chainB));
    System.out.println(chainA == chainB);
}

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

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

相关文章

会声会影2024出来了吗?有哪些新功能?剪辑后音乐剪辑教程

会声会影 2024视频编辑软件,既加入光影、动态特效的滤镜效果,也提供了与色彩调整相关的LUT配置文件滤镜,可选择性大,运用起来更显灵活。会声会影在用户的陪伴下走过20余载,经过上百个版本的优化迭代,已将操…

硬件工程师到底可以从哪些方面提升自己?

大家好,这里是大话硬件。 最近在大话硬件群里,聊得比较多的就是讨论怎么提升自己的能力,怎么拿到更高的工资。我想,这可能并不是只在大话硬件群才有的话题,其实在每一位工作的人心里应该都在想的两个问题。 因此,这篇文章简单分享一下,作为一名硬件工程师,可以在做哪…

【LeetCode刷题-链表】--876.链表的中间结点

876.链表的中间结点 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*…

Jmeter压测 —— 1秒发送1次请求

场景:有时候测试场景需要设置请求频率为一秒一次(或几秒一次)实现方法一:1、首先需要在线程组下设置循环次数(可以理解为请求的次数) 次数设置为请求300次,其中线程数跟时间自行设置 2、在设置…

Python数据分析实战-筛选出DataFrame中指定列都不包含缺失值的记录(附源码和实现效果)

实现功能 筛选出DataFrame中指定列都不包含缺失值的记录 实现代码 import pandas as pd# 创建示例DataFrame data {A: [1, 2, 3, None, 5],B: [1, None, 3, 4, 5],C: [1, 2, 3, 4, 5] } df pd.DataFrame(data)# 筛选出指定列都不包含缺失值的记录 columns_to_check [A, B…

【四、http】go的http的文件下载

一、日常下载图片到本地 //下载文件func downloadfile(url, filename string) {r, err : http.Get(url)if err ! nil {fmt.Println("err", err.Error())}defer r.Body.Close()f, err : os.Create(filename)if err ! nil {fmt.Println("err", err.Error())…

段错误如何调试

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言段错误产生的原因问题1:访问不存在的内存地址问题2:访问只读的内存地址问题3:栈溢出问题4:内存越界如何解决段错…

海康监控摄像机和录像机接入LiveMedia GB28181平台实现远程调取监控视频

海康威视各种型号监控摄像头或硬盘录像机(NVR/HVR)接入LiveMedia GB28181平台配置过程都非常简单明了,但有些细节需要注意,避免走弯路。 1、基本要求 (1) 网络要求 总体来说,只要监控设备和GB28181平台的网络是连通…

RT-DETR 项目【训练】【验证】【推理】脚本

文章目录 训练 --train.py推理 --detect.py验证 --val.py不训练,只查看模型结构/参数量 --test.py有同学问 RT-DETR 怎么训练,其实和 YOLOv8 几乎一样,但是有很多同学没接触过 v8 我这里直接给大家写好几个脚本,大家直接在我的脚本上调节参数就可以训练了, 脚本包含【训…

使用Gorm进行CRUD操作指南

使用GORM在Go中创建、读取、更新和删除记录的逐步教程 在数据库管理中,CRUD操作是应用程序的支柱,它们使数据的创建、检索、更新和删除成为可能。强大的Go对象关系映射库GORM通过抽象SQL语句的复杂性,使这些操作变得轻松。本文将作为您全面指…

内网穿透Windows下快速搭建个人WEB项目无需服务器

📑前言 本文主要是windows下内网穿透文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 🌄每日一句:努力…

实测用AI还原让子弹飞名场面

最近这两天,郭德纲说英语相声的视频刷到了一遍又一遍,这些视频并非简单的配音或者AI变声,而是高度贴合人物声线和风格、甚至连嘴型都匹配,如果不仔细看,你根本看不出任何破绽,因为内容是郭德纲的&#xff0…

Linux查看磁盘、内存、cpu信息

1. 查看磁盘空间信息:lsblk 2. 查看内存信息:awk $3"kB"{$2$2/1024^2;$3"GB";} 1 /proc/meminfo | column -t 3. 查看cup相关信息:lscup

解决ModuleNotFoundError: No module named ‘yaml‘

报错:ModuleNotFoundError: No module named yaml 使用: pip install yaml 仍然报错: 最终解决方案: pip install pyyaml 或者 conda install pyyaml

【Redis】数据类型前置知识

文章目录 前置知识redis的单线程架构 前置知识 type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、list(列表)、hash(哈希)、set(集合&#xff0…

各位社区工作者!打工而已,不要太上头!!

社工家人们,打工而已,不要太上头!咱能偷懒的就偷懒啊! 合情合理的偷懒不仅让你更轻松,工作效率还会提高,何乐而不为呢!!就比如说各种报告啊,活动方案这些啊,…

Latex编辑记录

1 第一段默认是不首行缩进的 在最前面合适的地方,也即是有usepackage类似定义的地方粘贴下列语句 \usepackage{indentfirst} 然后在要首行缩进的地方,放下面这个语句即可 \setlength{\parindent}{2em} 2 公式编辑 3 对文本高亮标记 \usepackage{soul}…

【前端设计】HTML+CSS+JavaScript基本特性

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

阿里云上传

/*** 上传图片** param file 文件* return* throws Exception*/ PostMapping(value "/aliUpload") ResponseBody public AjaxResult aliUpload(MultipartFile file){//获取文件后缀String extension FileUploadUtils.getExtension(file);String imgFormat "{…

虹科分享 | AR眼镜开启工业创新之旅!

文章来源:虹科数字化与AR 阅读原文:https://mp.weixin.qq.com/s/3qBr44ZYWpNaU8xPBBlEYA AR眼镜,开启无限创新之旅! 智能AR眼镜被视为在工业应用中带来最大益处的智能设备之一。它不仅能够解放双手,提高工作效率&…