- ArrayList 不是线程安全的集合。如果多个线程可能同时访问和修改ArrayList,可以考虑以下几种方法来解决这个问题:
1、使用线程安全的集合: 使用 CopyOnWriteArrayList 或者 Collections.synchronizedList 包装的 ArrayList。 代码如下:
private final BlockingQueue<List<MBTilesGrid>> rasterContainer = new ArrayBlockingQueue<>(200);public void processGrids() throws Exception {while (true) {List<MBTilesGrid> grids = this.rasterContainer.take();if (grids != null) {List<MBTilesGrid> threadSafeGrids = new CopyOnWriteArrayList<>(grids);// 使用线程安全的集合进行操作for (MBTilesGrid grid : threadSafeGrids) {// 处理 grid}}}}
2、使用显式同步: 在访问和修改集合时使用同步块。 代码如下
private final BlockingQueue<List<MBTilesGrid>> rasterContainer = new ArrayBlo