交换时,SynchronizedList获取空值

时间:2015-03-27 03:28:59

标签: java concurrentmodification

我正在尝试编写“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值可以来自哪里?

0 个答案:

没有答案