AtomicReference 原子性引用
- Rxjava源码里面关于AtomicReference 数组引用删除代码记录
final AtomicReference<AsyncDisposable<T>[]> subscribers;
void remove(AsyncDisposable<T> ps) {
//死循环,保证AtomicReference一定能更新成功
for (;;) {
//获取需要删除的数组
AsyncDisposable<T>[] 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<T>[] 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;
}
}
}