假设您有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中进行更改时它会被访问。这是不允许的还是某些内容还是会正常运行?
答案 0 :(得分:5)
未指定行为。从理论上讲,addAll()
可能会使o.get(7)
抛出异常,挂起,返回错误值或执行任何其他操作。
使用ArrayList
挂起是一个非常不可能的选项,但其他结构(例如HashMap
,LinkedList
,...)则不太宽容。
所以基本上你不想依赖“它不会那么糟糕,不是吗?”
有一个列表实现,基本上实现了“在进行更改时读取旧内容”,它是CopyOnWriteArrayList
。如果你只关心正确的读取,但并不总是需要最新的读取,如果写入远不如读取,那么这可能是一个很好的解决方案。