java并发发生在之前

时间:2015-01-22 10:59:40

标签: java multithreading

假设您有2个带有共享数组对象列表的线程,然后您进入其中一个线程,并通过添加更多对象来更改整个arraylist,

static ArrayList<Object> o =
static Object lock = new Object();
线程1中的

         o.addAll(another arraylist);
         synchronized(lock){}

然后定期说你有线程2做这样​​的事情,

        synchronized(lock){}
        o.get(7);

列表最终会得到正确的更新,但是在线程1中进行更改时它会被访问。这是不允许的还是某些内容还是会正常运行?

1 个答案:

答案 0 :(得分:5)

未指定行为。从理论上讲,addAll()可能会使o.get(7)抛出异常,挂起,返回错误值或执行任何其他操作。

使用ArrayList挂起是一个非常不可能的选项,但其他结构(例如HashMapLinkedList,...)则不太宽容。

所以基本上你不想依赖“它不会那么糟糕,不是吗?”

有一个列表实现,基本上实现了“在进行更改时读取旧内容”,它是CopyOnWriteArrayList。如果你只关心正确的读取,但并不总是需要最新的读取,如果写入远不如读取,那么这可能是一个很好的解决方案。