使用synchronized或使用Java提供的CopyOnWriteArrayList类
解决本地ArrayList对象的线程安全问题有两种常见方法。第一种方法是使用synchronized关键字来同步访问ArrayList对象,确保多个线程不会同时同时读取或修改这个对象。例如:
public class MyArrayList {
private ArrayList list = new ArrayList<>();
public synchronized void add(String element) {
list.add(element);
}
public synchronized String get(int index) {
return list.get(index);
}
public synchronized int size() {
return list.size();
}
}
上面的示例使用synchronized关键字同步所有访问ArrayList对象的方法。这样就可以保证多线程操作这个对象时不会出现问题,但是这种方法在高并发下的效率比较低。
第二种方法则更为高效,即使用Java提供的CopyOnWriteArrayList类。这个类是一个线程安全的ArrayList,它在每次更新操作时都会创建一个新的数组,从而实现读操作的无锁化,从而提高并发性能。例如:
import java.util.concurrent.CopyOnWriteArrayList;
public class MyArrayList {
private CopyOnWriteArrayList list = new CopyOnWriteArrayList<>();
public void add(String element) {
list.add(element);
}
public String get(int index) {
return list.get(index);
}
public int size() {
return list.size();
}
}
上面的示例使用CopyOnWriteArrayList类创建了一个线程安全的ArrayList对象,不需要使用synchronized关键字来同步访问。这个类的缺点是内存占用比较高,不适合操作大量数据。