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

问题描述:

系统定义了一套校验链:链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会相等。

多线程环境下使用责任链,串链了_第1张图片

那怎样才能不会串链?那就别用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);
}

多线程环境下使用责任链,串链了_第2张图片

你可能感兴趣的:(java,开发语言)