May*_*yur 1 java concurrency list
我正在为应用程序开发一个自定义appender,它会将日志消息写入应用程序级变量列表.因此,在应用程序中运行的所有线程都将访问此列表,以便同时向此列表添加消息(只写操作).还有一个单独的工作,也可以同时访问此列表,并每隔几毫秒批量删除25个项目.因此,列表上的添加和删除操作将同时执行.现在,我的问题是,如果我可以使用java.util.ArrayList?我在某处看到,同时向ArrayList添加项目可能会出现问题.此外,当我们尝试从列表中删除25个项目而其他线程添加到列表时,肯定会出现问题.
如果我创建自己的List MYList实现,它只是创建一个新的remove25()方法并对此方法使用synchronize限定符,它会解决我的问题吗?或者我应该去更安全的选项,比如CopyOnWriteArrayList,这可能是非常糟糕的性能(??),因为日志操作需要同时由许多应用程序线程完成.请指教.
一个更新:因为我不需要随机访问,只需要顺序访问大量的添加和删除操作,链接列表类型的实现会更好.
我会使用像ArrayBlockingQueue这样的线程安全队列,它有一个drainTo方法,允许你一次提取多个值.
BlockingQueue<String> queue = new ArrayBlockingQueue<>(100000);
// to add
queue.add(log);
// to grab up to 25 elements
queue.drainTo(copy, 25);
Run Code Online (Sandbox Code Playgroud)