1、包含
1、synchronizedList
2、CopyOnWriteArrayList
3、Vector
使用时建议根据需要场景进行模拟,选择效率最优的一款。
2、代码参考
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Vector;
import java.util.concurrent.*;
/**
* 线程安全数组list
* @author kaura
*/
public class EzFutures {
private static int CIRCULATE = 10000;
public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
// 创建一个简单点线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
50,
100,
1000,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(16),
new ThreadPoolExecutor.CallerRunsPolicy());
List<CompletableFuture<Void>> futureList = new ArrayList<>();
// 第一种 使用synchronizedList
// List<Integer> list = new ArrayList<>();
// List<Integer> syncList = Collections.synchronizedList(list);
// 第二种,使用CopyOnWriteArrayList
// CopyOnWriteArrayList<Integer> syncList = new CopyOnWriteArrayList<>();
// 第三种,使用vector
Vector<Integer> syncList = new Vector<>();
// 开始时间
long startTime = System.currentTimeMillis();
for (int i = 0; i < CIRCULATE; i++) {
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
try{
Thread.sleep(100);
syncList.add(1);
} catch (Exception e) {
e.printStackTrace();
}
}, executor);
futureList.add(future);
}
CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]))
.get(300, TimeUnit.MILLISECONDS);
// 结束时间
long endTime = System.currentTimeMillis();
System.out.println("执行时间(毫秒):" + (endTime - startTime) + "ms, syncListSize:" + syncList.size());
// 执行时间(毫秒):51086ms, syncListSize:10000 CopyOnWriteArrayList
// 执行时间(毫秒):47842ms, syncListSize:10000 synchronizedList
// 执行时间(毫秒):47000ms, syncListSize:10000 Vector
}
}