List中安全地删除对象

import java.util.ArrayList;  
import java.util.Iterator;  
import java.util.List;  
  
public class IteratorTest{  
public static void main(String[] args) {  
List<String> list = new ArrayList<String>();  
list.add("Test1");  
list.add("Test2");  
list.add("Test3");  
list.add("Test4");  
list.add("Test5");  
  
for(Iterator<String> it = list.iterator();it.hasNext();){  
if(it.next().equals("Test3")){  
it.remove();  
}  
}  
  
for(String s : list){  
System.out.println(s);  
}  
       
}  
}  


Iterator支持从源集合中安全地删除对象,只需在Iterator上调用remove()即可。这样做的好处是可以避免ConcurrentModifiedException,这个异常顾名思意:当打开Iterator迭代集合时,同时又在对集合进行修改。有些集合不允许在迭代时删除或添加元素,但是调用Iterator的remove() 方法是个安全的做法。
在多线程环境下安全删除 `List` 中元素可以采用以下几种方法: #### 1. 使用线程同步机制 可以使用 `lock` 语句(在 C# 中)或者 `synchronized` 关键字(在 Java 中)对 `List` 的操作进行加锁,确保同一时间只有一个线程可以访问和修改 `List`。以下是 C# 的示例代码: ```csharp using System; using System.Collections.Generic; using System.Threading; class Program { static List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; static readonly object lockObject = new object(); static void Main() { Thread t1 = new Thread(RemoveEvenNumbers); Thread t2 = new Thread(RemoveOddNumbers); t1.Start(); t2.Start(); t1.Join(); t2.Join(); foreach (var number in numbers) { Console.WriteLine(number); } } static void RemoveEvenNumbers() { lock (lockObject) { for (int i = numbers.Count - 1; i >= 0; i--) { if (numbers[i] % 2 == 0) { numbers.RemoveAt(i); } } } } static void RemoveOddNumbers() { lock (lockObject) { for (int i = numbers.Count - 1; i >= 0; i--) { if (numbers[i] % 2 != 0) { numbers.RemoveAt(i); } } } } } ``` 在这个示例中,使用 `lock` 语句确保了同一时间只有一个线程可以对 `numbers` 列表进行删除操作,避免了并发问题。 #### 2. 使用线程安全的集合 可以使用 `Collections.synchronizedList` 方法(在 Java 中)或者 `ConcurrentBag<T>`、`ConcurrentQueue<T>`、`ConcurrentDictionary<TKey, TValue>` 等线程安全的集合(在 C# 中)来替代普通的 `List`。不过需要注意,`ConcurrentBag<T>` 不支持对集合进行修改的操作,例如删除指定元素等,它主要用于在多线程环境中安全地进行添加和提取操作。如果需要支持更多的集合操作,可能需要考虑其他实现了 `ICollection<T>` 接口的线程安全集合[^4]。以下是 Java 使用 `Collections.synchronizedList` 的示例代码: ```java import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Main { public static void main(String[] args) { List<Integer> numbers = Collections.synchronizedList(new ArrayList<>()); numbers.add(1); numbers.add(2); numbers.add(3); numbers.add(4); numbers.add(5); Thread t1 = new Thread(() -> { synchronized (numbers) { for (int i = numbers.size() - 1; i >= 0; i--) { if (numbers.get(i) % 2 == 0) { numbers.remove(i); } } } }); Thread t2 = new Thread(() -> { synchronized (numbers) { for (int i = numbers.size() - 1; i >= 0; i--) { if (numbers.get(i) % 2 != 0) { numbers.remove(i); } } } }); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } for (Integer number : numbers) { System.out.println(number); } } } ``` `Collections.synchronizedList` 方法会对传入的 `list` 对象的 `get`,`add`,`remove` 等方法都添加 `synchronized` 锁,但其中的 `listIterator()` 方法并没有加锁,不是线程安全的[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值