在命令执行程序中有两种方法。一种用于记录审核日志,下一种方法用于将审核日志保存到数据库。应用程序将记录来自应用程序的不同进程的审计信息,并在每个进程结束时调用run方法以最终将审计信息保存到DB中。
ArrayList用于存储所有审计信息以及生成此审计数据的事件。现在,Arraylist在所有进程中共享。我只有一个CommandExecutor实例共享所有进程。
我的问题是让它对所有进程都是线程安全的。
@Service
public class CommandExecutor {
private static final Logger logger = Logger.getLogger(CommandExecutor.class);
private final ArrayList<TransactionAudit> transactionRecordList = new ArrayList<TransactionAudit>();
@Autowired
private TransactionService transactionService;
@Autowired
private TransactionDAO transactionDAO;
/**
* Record the audit data at the collector points. At this point audit mayn't
* be saved
*
* @param tAudit
* @return
*/
public void record(TransactionAudit audit) {
transactionRecordList.add(audit);
}
/**
* Audit data will be saved on call of run method. Till than the data will
* in transactionRecordList.
*
* @param key
* - Unique get the recorded audit data.
*/
public void run() {
transactionRecordList.forEach((audit)->{
transactionDAO.saveAudit(audit);
});
transactionRecordList.clear();
}
答案 0 :(得分:0)
您需要查看java.util.concurrent包。
我唯一需要做的就是改变你正在使用的List的实现,所以使用CopyOnWriteArrayList来代替ArrayList。
同时将transactionRecordList声明为List&lt;&gt;接口类型,因此即使您更改了实现,也可以通过接口公开的API(Liskov Principle)与List进行交互
所以它应该变成这样:
private static final List<TransactionAudit> transactionRecordList = new CopyOnWriteArrayList<TransactionAudit>();