Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使命令模式线程安全?_Java_Design Patterns - Fatal编程技术网

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

Java 如何使命令模式线程安全?,java,design-patterns,Java,Design Patterns,在命令执行器中有两种方法。一种用于记录审核日志,另一种用于将审核日志保存到数据库。应用程序将记录来自应用程序不同进程的审核信息,并在每个进程结束时调用run方法,最终将审核信息保存到数据库中 ArrayList用于存储所有审核信息以及生成此审核数据的事件。ArrayList现在在整个流程中共享。我只有一个CommandExecutor实例在整个进程中共享 我的问题是使它对所有进程都是线程安全的 @Service public class CommandExecutor { private s

在命令执行器中有两种方法。一种用于记录审核日志,另一种用于将审核日志保存到数据库。应用程序将记录来自应用程序不同进程的审核信息,并在每个进程结束时调用run方法,最终将审核信息保存到数据库中

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();
}
@服务
公共类命令执行器{
私有静态最终记录器=Logger.getLogger(CommandExecutor.class);
私有最终ArrayList transactionRecordList=新ArrayList();
@自动连线
私人交易服务交易服务;
@自动连线
私有事务dao事务dao;
/**
*在收集器点记录审核数据。此时审核可能不会
*得救
* 
*@param tAudit
*@返回
*/
公共作废记录(交易审计){
transactionRecordList.add(审计);
}
/**
*审核数据将在调用run方法时保存。直到
*在transactionRecordList中。
* 
*@param-key
*-获取记录的审核数据。
*/
公开募捐{
transactionRecordList.forEach((审计)->{
transactionDAO.saveAudit(审计);
});
transactionRecordList.clear();
}

您需要查看java.util.concurrent包

我看到需要做的唯一一件事就是更改您正在使用的列表的实现,因此使用CopyOnWriteArrayList而不是ArrayList

还将transactionRecordList声明为列表接口类型,因此即使更改了实现,也可以仅通过接口公开API(Liskov原则)与列表交互

所以它应该变成这样:

private static final List<TransactionAudit> transactionRecordList = new CopyOnWriteArrayList<TransactionAudit>();
private static final List transaction recordlist=new CopyOnWriteArrayList();

抱歉,StackOverflow不是这样工作的。请参加,访问并阅读以了解如何有效地使用此网站。(1)了解“线程安全”的含义;(2)根据步骤(1)中了解的内容修改代码.多线程编程是一个庞大而复杂的主题。我们无法在这里教您需要了解的内容,我们当然不会为您做这些工作。问题不是如何使transactionRecordList线程安全。我试图解决的问题是在多线程环境中工作时使用命令设计模式。我可以记录不同的事件,但我不确定这些事件是否会以正确的顺序保存。CommandExecutor是一个单音类,它的状态可以由任何线程修改。嗯,命令模式通常不会出现多线程问题。当您让命令类尝试保留信息时,问题就会出现。这些问题包括es将显示为、保留、由于覆盖而导致的信息丢失和其他并发问题。因此,只要您确保状态更新和检索是“线程安全的”您应该已经清除了这个问题。我正在使用concurrenthasmap并用一个键映射每个事件。run方法将用键标识事件并保存审核。它将省略由其他进程生成的审核。请寻找一些最佳做法来解决类似问题。