【发布时间】:2014-04-30 14:58:34
【问题描述】:
我的代码,
synchronized (countInfo) {
count++;
countInfo = new File(dto.findMyLocation()+"\\Properties\\countInfo"+Start.session.getId()+".txt");
BufferedWriter writer = new BufferedWriter(new FileWriter(countInfo));
writer.write(String.valueOf(count));
writer.close();
}
这里的countInfo 是对一个文件的引用,以及我的多个线程编写这段代码的方法。我在“同步(countInfo)”行收到空指针异常。我知道这是因为在这一行它还不知道 wat countInfo 被初始化为,所以为此我将不得不移动 `
countInfo = new File(dto.findMyLocation()+"\\Properties\\countInfo"+Start.session.getId()+".txt");
同步块之外的行。但如果我这样做,那么访问我的这个方法的所有线程都会创建一个新文件。但我的目标是只有一个线程(进入此方法的第一个线程)必须创建一个文件,所有其他线程应该只读取创建文件中的信息。我怎样才能做到这一点?请帮忙。我是 Java 和多线程的新手!请丰富我的知识!!提前致谢!
UPDATE - 说明流程的图片。
黄色标记的行,跨会话文件访问永远不会发生,因为我使用了附加到文件名的会话 ID。
【问题讨论】:
-
令人惊讶!在我将那条线从同步块移到上面之后。它工作正常!但是如何!!!!!!!!!!!!顺便说一句,在我删除同步块和线程同步的整个概念之后,它对我来说工作正常!这怎么可能??我看到我所做的笏研究和我在这里实际看到的笏研究完全不同!谁能解释一下这个!!??
-
等等,您在同步块中重新分配的对象上进行同步??
-
@VasanthNagKV 但它会是线程安全的吗?
-
@VasanthNagKV 它有时会起作用并不意味着它会一直起作用。所以为了保证你不能跳过同步。
-
告诉我有关会话ID的信息...不同的进程/用户可以有不同的ID? ...所以你想写入特定会话的文件?
标签: java multithreading session thread-safety