我正在尝试编写“swap-list”,认为是双缓冲区,但是对象而不是原始字节。基本上我这样做是为了减少争用,所以一个任务可以在添加交换列表时进行大量删除。
public class SwapList<T> {
List<T> A;
List<T> B;
volatile boolean swap;
public SwapList() {
A = Collections.synchronizedList( new ArrayList<T>());
B = Collections.synchronizedList( new ArrayList<T>());
swap = false;
}
public void swap() {
swap = !swap;
}
public List<T> getA() {
return swap ? A : B;
}
public List<T> getB() {
return swap ? B : A;
}
public int size() {
return A.size() + B.size();
}
public void clear() {
A.clear();
B.clear();
}
}
几个线程可能是这样的,只有一个线程会调用swap(),并通过调用getB()来获取旧的A
// declared statically in same package
public static SwapList<String> list = new SwapList<>();
// one thread does this
int i = 1000;
while( i-- > 0 ) {
list.getA().add("A");
// another thread does this
int i = 1000;
list.swap();
while( i-- > 0 ) {
list.getB().add("B");
两个线程都是这样启动的,但我尝试过其他的东西,比如“执行器”服务。
Thread b = new Thread() {
@Override
public void run() {
int i = lim; // lim is some int
list.swap(); // only the second one will call swap
while( i-- > 0 ) {
list.getB().add("B");
}
}
};
// later
a.start();
b.start();
a.join();
b.join();
System.out.println( list.getA() );
然而,我经常会遇到意外的["A","A","A",null,"A","A",...]
null值可以来自哪里?