在多线程环境中,如果你在一个线程中修改了ArrayList
,而在另一个线程中尝试读取它,可能会遇到显示不出来的问题。这通常是由于线程安全问题引起的。ArrayList
本身不是线程安全的,当多个线程同时对其进行读写操作时,可能会导致数据不一致或丢失。
Collections.synchronizedList(new ArrayList<>())
。CopyOnWriteArrayList
。你可以使用Collections.synchronizedList
来包装你的ArrayList
,使其变成线程安全的。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ThreadSafeListExample {
public static void main(String[] args) {
List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
// 写线程
new Thread(() -> {
for (int i = 0; i < 10; i++) {
synchronizedList.add("Item " + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
// 读线程
new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println(synchronizedList);
try {
Thread.sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
CopyOnWriteArrayList
是一个线程安全的变体,适用于读多写少的场景。
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
public class CopyOnWriteArrayListExample {
public static void main(String[] args) {
List<String> copyOnWriteArrayList = new CopyOnWriteArrayList<>();
// 写线程
new Thread(() -> {
for (int i = 0; i < 10; i++) {
copyOnWriteArrayList.add("Item " + i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
// 读线程
new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println(copyOnWriteArrayList);
try {
Thread.sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
当你在多线程环境中操作ArrayList
时,需要确保线程安全。可以使用同步集合或并发集合来解决这个问题。选择哪种方法取决于你的具体需求和应用场景。
领取专属 10元无门槛券
手把手带您无忧上云