java - 哪种类型的 List 实现用于保存内存日志

标签 java list concurrency

我正在为应用程序开发一个自定义附加程序,它将日志消息写入应用程序级变量列表。因此,应用程序中运行的所有线程都将访问此列表以同时向此列表添加消息(只写操作)。 有一个单独的作业也将同时访问此列表并每隔几毫秒批量删除 25 个项目。因此,列表上的添加和删除操作将同时执行。 现在,我的问题是我是否可以使用 java.util.ArrayList?我在某处看到同时向 ArrayList 添加项目时可能会出现问题。此外,当我们尝试从列表中删除 25 个项目而其他线程正在添加到列表时,肯定会出现问题。

如果我创建自己的 List MYList 实现,它只需创建一个新的 remove25() 方法并为此方法使用同步限定符,它会解决我的问题吗?或者我应该选择更安全的选项,如 CopyOnWriteArrayList,这在性能上可能非常糟糕(??),因为日志记录操作需要由许多应用程序线程同时完成。请指教。

一个更新:因为我不需要随机访问,只需要带有大量添加和删除操作的顺序访问,链表类型的实现会更好。

最佳答案

我会使用像 ArrayBlockingQueue 这样的线程安全队列,它有一个 drainTo 方法,允许您一次提取多个值。

BlockingQueue<String> queue = new ArrayBlockingQueue<>(100000);

// to add
queue.add(log);

// to grab up to 25 elements
queue.drainTo(copy, 25);

关于java - 哪种类型的 List 实现用于保存内存日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40153938/

相关文章:

java - MyBatis 复杂插入

java - 如何在 Java 中检查以下实例?

CMPXCHG 和关键部分实现

c++ - 带引用计数的无锁堆栈

java - 为什么在 java-8 stream reduce 操作中不执行 combiner 函数?

java - 需要使用正则表达式从字符串中的十进制数中删除尾随 0

python - python中的映射方法

python - 这是我的代码。我正在尝试获取整数的用户输入,通过利用映射的函数并返回立方结果列表

list - scala:组合两组列表

java - 由于并发错误,服务器未正常关闭