gpt4 book ai didi

java - 在 ArrayList 线程安全上移动对象的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-02 00:40:35 27 4
gpt4 key购买 nike

我在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com