2022-05-12

AtomicReference 原子性引用
  • Rxjava源码里面关于AtomicReference 数组引用删除代码记录
 final AtomicReference[]> subscribers;
 void remove(AsyncDisposable ps) {
        //死循环,保证AtomicReference一定能更新成功
        for (;;) {
            //获取需要删除的数组
            AsyncDisposable[] a = subscribers.get();
            int n = a.length;
            if (n == 0) {
                return;
            }

            int j = -1;
            //寻找需要删除的对象
            for (int i = 0; i < n; i++) {
                if (a[i] == ps) {
                    j = i;
                    break;
                }
            }

            if (j < 0) {
                return;
            }

            AsyncDisposable[] b;

            if (n == 1) {
                b = EMPTY;
            } else {
               //创建新的数组,来装新的数据
               //好处就是数组对象是安全的,还有就是性能更好
                b = new AsyncDisposable[n - 1];
                System.arraycopy(a, 0, b, 0, j);
                System.arraycopy(a, j + 1, b, j, n - j - 1);
            }
            //如果更新成功就返回为true
            if (subscribers.compareAndSet(a, b)) {
                return;
            }
        }
    }

你可能感兴趣的:(2022-05-12)