在Java中,处理列表的并发操作需要使用线程安全的数据结构。Java提供了几种线程安全的数据结构,如Vector
、Collections.synchronizedList()
方法包装的列表以及ConcurrentHashMap.newKeySet()
方法返回的集合。下面是一些示例:
- 使用Vector:
import java.util.Vector; public class ConcurrentListExample { public static void main(String[] args) { Vectorlist = new Vector<>(); // 创建两个线程,分别向列表中添加元素 Thread t1 = new Thread(() -> { for (int i = 0; i < 10; i++) { list.add("Thread1-" + i); } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 10; i++) { list.add("Thread2-" + i); } }); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Vector: " + list); } }
- 使用Collections.synchronizedList()包装列表:
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ConcurrentListExample { public static void main(String[] args) { Listlist = Collections.synchronizedList(new ArrayList<>()); // 创建两个线程,分别向列表中添加元素 Thread t1 = new Thread(() -> { for (int i = 0; i < 10; i++) { list.add("Thread1-" + i); } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 10; i++) { list.add("Thread2-" + i); } }); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Synchronized List: " + list); } }
- 使用ConcurrentHashMap.newKeySet()返回的集合:
import java.util.Set; import java.util.concurrent.ConcurrentHashMap; public class ConcurrentListExample { public static void main(String[] args) { Setset = ConcurrentHashMap.newKeySet(); // 创建两个线程,分别向集合中添加元素 Thread t1 = new Thread(() -> { for (int i = 0; i < 10; i++) { set.add("Thread1-" + i); } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 10; i++) { set.add("Thread2-" + i); } }); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("ConcurrentHashMap KeySet: " + set); } }
注意:在使用Collections.synchronizedList()
包装列表时,需要注意对整个操作进行同步,以避免并发问题。例如,在上面的示例中,我们使用了join()
方法来等待两个线程完成操作。而在使用ConcurrentHashMap.newKeySet()
时,由于它本身是线程安全的,因此不需要额外的同步措施。