我们有一个多线程的java程序.多线程将写入文件,一个线程将从该文件读取.我正在寻找一些设计理念.同步是否必要?
FileChannel理论上是线程安全的.来自javadoc:
文件通道可供多个并发线程使用.可以在Channel接口指定的任何时间调用close方法.在任何给定时间,只有一个涉及通道位置或可以更改其文件大小的操作可能正在进行中; 在第一个操作仍在进行时尝试启动第二个此类操作将阻塞,直到第一个操作完成.其他操作,特别是那些采取明确立场的操作,可以同时进行; 他们实际上是否这样做取决于基本的实施,因此没有具体说明.
如果您可以使用这些,那么您可以使用内置同步,而不必编写自己的同步.
在这种情况下我会考虑同步.想象一下,2个线程(t1和t2)同时打开文件并开始写入它.第一个线程执行的更改被第二个线程覆盖,因为第二个线程是最后一个将更改保存到文件的线程.当线程t1正在写入文件时,t2必须等到t1完成它的任务才能打开它.
此外,如果您关心文件的最新可能更新,您应该将写入线程与读取文件的线程同步,以便在有任何线程写入文件时,读取线程应该等待.