java - 基本数据记录器的实现

标签 java synchronization

在我的代码中,我有一个名为 DataLogger 的对象。顾名思义,它负责将数据记录到文件中。

该类的框架如下所示:

class DataLogger {

   private BufferedWriter mFileWriter = ...
   private boolean mRunning = false;

   //constructor
   public DataLogger() {
   //init stuff
   }

   public void onEvent(..) {
   //...
   if(mRunning) {
      mFileWriter.write(...);
   }
   /...
   }

   public void start() {
   //startdata logging
   mRunning = true;
   }

   public void stop() {
   //stop data logging
   mRunning = false;
   //closing File writer etc.
   }
}

因此该对象在 onEvent 方法中接收Events。每次出现新事件时,数据都会记录到文件中。数据记录器应使用 start() 方法启动,并使用 stop() 方法停止。我在这段代码中看到的问题是,如果 DataLogger 的客户端/调用者调用 stop() ,则可能是事件在同一时刻到达,然后将被记录,尽管用户之前曾调用过 stop()。如果数据流已经关闭,这甚至可能导致崩溃。我想我需要在这里添加一些同步/锁定代码,对吗?扩展代码的最佳方式是什么?

最佳答案

最直接的解决方案是同步 onEvent() 和 stop()。这样,只能同时调用这两个方法之一,从而解决您最初的问题。

public void onEvent(..) {
public void start() {
public void stop() {

变成了

public synchronized void onEvent(..) {
public synchronized void start() {
public synchronized void stop() {

关于java - 基本数据记录器的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26465761/

相关文章:

c# - 什么时候应该关心在开始下一个方法之前完成一种方法?

java - ConcurrentHashMap:避免使用 "putIfAbsent"创建额外的对象?

objective-c - 与 iOS 存储和同步图像

java - 以下 xml 需要 xslt 输出

Java do while 循环不循环

java - 在 Java 中置换 HashMap 的数据

java - 数据库同步技术JPA/GUI

java - 带有 setter/getter 的枚举

java - 使用 GSON 解析 JSON 文件

sdk - 微软/福特同步SDK