【发布时间】:2016-04-17 18:35:06
【问题描述】:
我有一个简单的方法,它将一行数据写入一个文件,然后是一个异步执行的新行。
def writeToFile(bw: BufferedWriter, str: String) = {
bw.write(str)
bw.newLine
}
当我的程序运行时,由于调用的异步性质,我在文件中“混淆”了行。例如...说 writeToFile(bw, "foo") 异步执行 3 次我可能会得到:
正确输出
富
富
富
可能输出不正确
foofoo
富
我可以通过使用这样的同步方法来避免这种可能性:
def writeToFile(bw: BufferedWriter, str: String) = synchronized {
bw.write(str)
bw.newLine
}
根据我的研究,我无法确定这在扩展我的应用程序方面有多“安全”。我可以找到使用 synchronized 的唯一示例是访问集合时,而不是写入文件。我的应用程序是在 Play 中构建的!框架 2.4.2。
【问题讨论】:
-
你是对的,同步是 JVM 设计的锁定该函数调用的方式。但是,这并不意味着您传递的任何 BufferedWriter 在此期间都受到保护,如果您有其他线程试图使用它,因此包装和隐藏该对象可能是明智的。参考此链接了解更多信息:twitter.github.io/scala_school/concurrency.html
标签: multithreading scala playframework bufferedwriter playframework-2.4