public class LockFreeSnapshot {
    int n = 0;
    SRSW[] V;
    public void LockFreeSnapshot(int initN) {
        n = initN;
        V = new SRSW[n];
    }
    public void writeLoc(int k, int x) {
        int seq = V[k].ts;
        V[k].setValue(x, seq + 1);
    }
    public SRSW[] readArray() {
        SRSW[] W = new SRSW[n];// W is local
        boolean done = false;
        while (!done) {
            for (int i = 0; i < n; i++) // copy V to W
                W[i].setValue(V[i].value, V[i].ts);
            done = true;
            // check if V has changed
            for (int i = 0; i < n; i++)
                if (W[i].ts != V[i].ts) {
                    done = false;
                    break;
                }
        }
        return W;
    }
}