krl*_*mlr 9 java concurrency stream
我使用文件作为大数据的缓存.一个线程按顺序写入,另一个线程按顺序读取它.
我是否可以确定write()
在一个线程中写入的所有数据都可以read()
来自另一个线程,假设在Java内存模型方面存在适当的"事先发生"关系?这种行为是否有记录?
在我的JDK中,FileOutputStream
不覆盖flush()
,并且OutputStream.flush()
为空.这就是我想知道的原因......
有问题的流程完全由我完全控制的类所有.保证每个流只能由一个线程访问.我的测试显示它按预期工作,但我仍然想知道这是否有保证和记录.
另见此相关讨论.
sbr*_*ges 11
假设您使用的是posix文件系统,那么是的.
FileInputStream
并且FileOutputStream
在*nix上内部使用读写系统调用.写文档说,读取将看到过去写入的结果,
在成功返回常规文件的write()之后:
从该写入修改的文件中每个字节位置的任何成功read()都将返回该位置的write()指定的数据,直到再次修改这些字节位置.
我很确定Windows上的ntfs会有相同的read()
write()
保证.
FileInputStream
您不能根据您和对象之间的 Java 内存模型来谈论“发生之前”关系,FileOutputStream
因为它们不共享任何内存或线程。VM 可以自由地重新排序它们,只需满足您的同步要求。当您在读取和写入之间实现正确的同步而无需应用程序级缓冲时,您就是安全的。
但是FileInputStream
,FileOutputStream
共享一个文件,这将事情留给操作系统,在主流操作系统中,您可以在按顺序写入后读取该文件。
归档时间: |
|
查看次数: |
4115 次 |
最近记录: |