import java.util.Observable;
import java.util.Observer;
import java.util.concurrent.atomic.AtomicInteger;

public class DrawLast extends Observable implements Observer {
    // Global static AtomicInteger to ensure thread safety
    public static final AtomicInteger activeDrawingObserverCount = new AtomicInteger(0);

    @Override
    public void update(Observable o, Object arg) {
        // Increment count safely
        DrawLast.activeDrawingObserverCount.incrementAndGet();
        try {
            // Do observer-specific operations
            System.out.println("Observer " + this + " is updating...");
            // Notify other observers, assuming each follows the same pattern in this update()
            setChanged();
            notifyObservers();
        } finally {
            // Decrement count safely in a finally block
            int remainingObservers = DrawLast.activeDrawingObserverCount.decrementAndGet();
            if (remainingObservers == 0) {
                draw(); // Call draw only when all observers are done
            }
        }
    }

    private void draw() {
        System.out.println("Drawing now that all observers are done.");
    }

    public static void main(String[] args) {
        DrawLast observer1 = new DrawLast();
        DrawLast observer2 = new DrawLast();
        DrawLast observer3 = new DrawLast(); // Last observer in the chain

        // Set up observers to observe each other in a chain
        observer1.addObserver(observer2);
        observer2.addObserver(observer3);

        // Start the chain by notifying observer1
        observer1.setChanged();
        observer1.notifyObservers();
    }
}