在Java Web中并发文件写入时出现意外输出

时间:2016-09-07 14:34:11

标签: java multithreading file web concurrency

我写了一个非常简单的Java Web应用程序,其中包括一些基本功能,如注册,登录,更改密码等。

我不使用数据库。我只是在应用程序中创建一个文件来记录用户的信息并完成数据库的工作。

我使用JMeter来强调Web应用程序,尤其是注册接口。 JMeter显示1000线程的结果是正确的 enter image description here  但是当我查看存储用户信息的information.txt时,这是错误的,因为它存储了700多条记录: enter image description here

但它应该包含1000条记录,它必须是某个错误的

我使用单例类来执行写/读操作,并且我向类添加了一个同步字,寄存器用于记录寄存器信息的insert()函数如下所示:(部分它)

public class Database {

private static Database database = null;
private static File file = null;


public synchronized static Database getInstance() {

    if (database == null) {
        database = new Database();
    }

    return database;
}


private Database() {

    String path = this.getClass().getClassLoader().getResource("/")
            .getPath() + "information.txt";
    file = new File(path);

    if (!file.exists()) {
        try {
            file.createNewFile();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}
public void insert(String account, String password, String username) {

    RandomAccessFile infoFile = null;

    try {
        infoFile = new RandomAccessFile(file, "rw");
        String record;
        long offset = 0;

        while ((record = infoFile.readLine()) != null ) {
            offset += record.getBytes().length+2;
        }

        infoFile.seek(offset);
        record = account+"|"+password+"|"+username+"\r\n";
        infoFile.write(record.getBytes());
        infoFile.close();

    } catch (IOException e) {
        e.printStackTrace();

    } finally {
        if (infoFile != null) {
            try {
                infoFile.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }


}
}

问题是为什么会发生这种情况,同步是线程安全的,为什么我丢失了这么多数据并且插入了一些空行,我能做些什么呢!

1 个答案:

答案 0 :(得分:1)

您正在同步getInstance()方法,但不是insert()方法。这使得检索数据库实例的线程安全,但不是写操作。