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

问题描述:

系统定义了一套校验链:链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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值