Sam*_*msh 1 java multithreading
假设您有2个带有共享数组对象列表的线程,那么您可以进入其中一个线程,并通过添加更多对象来更改整个arraylist,
static ArrayList<Object> o =
static Object lock = new Object();
Run Code Online (Sandbox Code Playgroud)
在线程1中
o.addAll(another arraylist);
synchronized(lock){}
Run Code Online (Sandbox Code Playgroud)
然后定期说你有线程2做这样的事情,
synchronized(lock){}
o.get(7);
Run Code Online (Sandbox Code Playgroud)
该列表最终会得到正确的更新,但是在线程1中进行更改时它的访问权限.这是不允许的还是某些内容还是会正常运行?
未指定行为.将addAll()在理论上的方式,将使实现o.get(7)抛出一个异常,死机,返回错误值或任何其他事情.
随着ArrayList挂是一个不太可能的选择,但其他结构(如HashMap,LinkedList...)是那么宽容.
所以基本上你不想依赖"它不会那么糟糕,是吗?"
有一个列表实现,它基本上实现了"在进行更改时读取旧内容",它就是CopyOnWriteArrayList.如果你只关心正确的读取,但并不总是需要最新的读取,如果写入远不如读取,那么这可能是一个很好的解决方案.
| 归档时间: |
|
| 查看次数: |
58 次 |
| 最近记录: |