Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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/1/typo3/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_Synchronization - Fatal编程技术网

Java 基本数据记录器的实现

Java 基本数据记录器的实现,java,synchronization,Java,Synchronization,在我的代码中有一个名为数据记录器的对象。顾名思义,它负责将数据记录到文件中 类的骨架如下所示: class DataLogger { private BufferedWriter mFileWriter = ... private boolean mRunning = false; //constructor public DataLogger() { //init stuff } public void onEvent(..) { //..

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

类的骨架如下所示:

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
方法中接收
事件。每次出现新事件时,数据都会记录到一个文件中。应使用
start()
方法启动数据记录器,并使用
stop()
方法停止数据记录器。我看到的这段代码的问题是,如果数据记录器的客户机/调用方调用
stop()
,则可能是事件刚好在同一时刻到达,然后将被记录,尽管用户以前调用过
stop()
。如果数据流已经关闭,这甚至可能导致崩溃。我想我需要在这里添加一些同步/锁定代码,对吗?扩展代码的最佳方法是什么?

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

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

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