Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免观察者模式中的冲突?_Java_Observer Pattern - Fatal编程技术网

Java 如何避免观察者模式中的冲突?

Java 如何避免观察者模式中的冲突?,java,observer-pattern,Java,Observer Pattern,这是香港电台的跟进问题 如果我有以下代码,并且方法信号由B的两个实例同时调用,这将导致每个B调用重置两次的冲突。我能做些什么来解决它 如果发生导致重置的事件,只有在所有B都完成重置时,才可以重置 public class A { private B b[]; public A() { //for loop b[i] = new B(this); } public void signal() { //tells e

这是香港电台的跟进问题

如果我有以下代码,并且方法信号由B的两个实例同时调用,这将导致每个B调用重置两次的冲突。我能做些什么来解决它

如果发生导致重置的事件,只有在所有B都完成重置时,才可以重置

public class A {
    private B b[];

    public A() {
        //for loop
        b[i] = new B(this);
    }

    public void signal() {
        //tells every B to reset.
        //for loop
        b[i].reset();
    }
}

public class B {
    A creator;

    public B(A creator) {
        this.creator = creator;
    }

    public void reset() {
        //very critical operation that should not happen back to back
    }

    public void main(String[] args) {

        while(true)
            if(isBad()==true) {
                //Something bad happen. Tell A to reset everyone.
                creator.signal();
            }

   }
}

重置中发生的情况对B的所有实例都至关重要吗?或者仅仅是B的一个实例被调用?调用不是同时的,而是连续的,每个B调用一次信号。你能把问题陈述得更清楚些吗?是否要避免多次连续重置?你想要什么样的行为?@HunterMcMillen这对所有的B都很重要。例如,所有B作为一个整体只能调用一次信号,并且在重置后再次调用。为不同的通知类型或要通知的特定观察者实施不同的方法。因为所有a都拥有不同的B,所以这不能通过使a.信号同步来完成吗?