作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Android 中使用外部库,该库具有可从另一个线程访问的对象的 ArrayList。我的问题是我想以一种不会在另一个线程上导致 null 异常的方式从此 AarrayList 中移动一些对象。
所以,我想做的是:我有一个ArrayList ABCDEFGH,我想将F从它的实际位置移动到第一个位置,这样ArrayList就会变成FABCDEGH。请注意,我不能使用交换来实现这一点,因为所有其他对象都会右移。
一个简单的实现是:
list.remove(F);
list.add(0,F);
但是这个实现会在另一个线程上导致空异常,因为另一个线程正在通过手写的计数循环来循环列表,因此由于竞争条件,线程循环可以在 F 的删除和添加之间运行。我可以' t 确保 ArrayList 安全,因为我无权访问外部库。
是否有更好的方法可以在没有竞争条件的情况下进行此移动(从 Arraylist 的任何位置到任何位置)?请注意,ArrayList 的大小不会被修改。
最佳答案
如果您拥有循环和交换代码,则可以同步列表上的两个操作。
// code for loop
for (int i = 0; i < length; i++) {
synchronized(list) {
letter = list.get(i);
}
// whatever else
}
// code for swap
synchronized(list) {
list.remove(F);
list.add(0,F);
}
更新
我假设您需要循环线程来查看在交换/循环代码中所做的更改。这是正确的吗?
如果没有,您可以简单地克隆/复制该列表以供自己使用。
List copy = new ArrayList(list);
copy.remove(F);
copy.add(0,F);
关于java - 在 ArrayList 线程安全上移动对象的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6524051/
我是一名优秀的程序员,十分优秀!