我目前正在使用Java 6和Spring 3。
我有一些正在读取同一文件的进程,在本例中是XML文件。
此外,此过程需要更新该文件的内容,我需要更新日期。
该过程同时进行,因此他们有可能会同时阅读并尝试写入。
我听说过ReadWriteLock,它可以有多个阅读器,只有一个编写器。 我正在考虑这一点。但由于流程正在快速运行,
当进程A当前正在编写更新时,将出现一种情况,进程B正在等待,另一个进程C正在等待编写更新。如果进程B正在更新相同的元素,则进程B可能只是一个旧的更新。
有什么想法我能做到这一点吗?
谢谢,
答案 0 :(得分:1)
如果所有“进程”都是线程,请使用同步。这正是这个用途。 ReadWriteLock无论如何都不会保护文件本身;它用于协调对内存中对象的共享访问。
像这样的伪代码:
class XmlDatabase {
Document doc = readXml();
synchronized Date readDate() {
Date _date = getDateFromDoc(doc);
return _date;
}
synchronized void writeDate(Date _date) {
addDateToDoc(_date);
writeDocToFile(doc);
}
}
很多人会告诉你同步很慢等等。除非你正在实现一些使用同步原语大规模并发的东西,否则它会正常工作。如果需要,您可以随后使用java.util.concurrent进行优化。使用普通同步的简单性和可读性是值得的。如果您需要让其他进程访问数据,只需使用RMI或其他网络解决方案包装数据库类。