如何使命令模式线程安全?

时间:2018-03-20 06:18:21

标签: java design-patterns

在命令执行程序中有两种方法。一种用于记录审核日志,下一种方法用于将审核日志保存到数据库。应用程序将记录来自应用程序的不同进程的审计信息,并在每个进程结束时调用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();
}

1 个答案:

答案 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>();