「データ」オブジェクトをファイルにシリアル化する複数のスレッドがあります。ファイル名は、オブジェクトの 2 つのフィールドに基づいています
クラスデータ{ org.joda.DateTime 時間; 文字列のタイトル。 public String getFilename() { return time.toString() + '_' + タイトル + ".xml"; }
2 つのデータ オブジェクトが同じ「時間」と「タイトル」を持ち、同じファイル名になる可能性があります。
これは許容範囲であり、どちらかが救われることを嬉しく思います。(それらが同じである場合、それらはおそらく同じ Data オブジェクトです)
私の問題は、2 つ (またはそれ以上) のスレッドが同時にファイルに書き込みを行っているため、不正な形式の XML が発生することです。
java.nio.channels.FileLock を見てみましたが、これは VM 全体のロック用であり、特にスレッド内ロックには適していません。
DataIO.class で同期できます (ただし、実際には個々のファイルでのみ同期したいので、これは大きなオーバーヘッドを引き起こします)。
複数の File オブジェクトが同じ System-File を表すことができるため、File オブジェクトでの同期は役に立ちません。
コードは次のとおりです。
クラスDataIO { public void writeArticleToFile(Article article, String filename, boolean overwrite) throws IOException { ファイル file = new File(ファイル名); writeArticleToFile(記事、ファイル、上書き); } public void writeDataToFile(Data data, File file, boolean overwrite) throws IOException { if (file.exists()) { if (上書き) { if (!file.delete()) { throw new IOException("上書きのため、ファイルの削除に失敗しました: " + file); } } そうしないと { throw new IOException("ファイル " + ファイル + " が既に存在し、上書きフラグが false に設定されています。"); } } ファイルparentFile = file.getParentFile(); if (parentFile != null) { file.getParentFile().mkdirs(); } file.createNewFile(); if (!file.canWrite()) { throw new IOException("ファイルに書き込む権限がありません: " + file); } FileOutputStream fos = new FileOutputStream(file, false); 試す { writeDataToStream(データ、fos); logger.debug("記事をファイルに書き込みました: " + file.getAbsolutePath()); } 最後に { fos.close(); } } }