マルチスレッドでファイル出力

マルチスレッドにて同じファイルへ出力する方法をメモ

TextWriter.Synchronized メソッド
指定した TextWriter をラップするスレッド セーフ ラッパーを作成します。
http://msdn.microsoft.com/ja-jp/library/system.io.textwriter.synchronized(VS.80).aspx

lock ステートメント
http://msdn.microsoft.com/ja-jp/library/c5kehkcz.aspx

Monitor.Enter メソッド
指定したオブジェクトの排他ロックを取得します。
http://msdn.microsoft.com/ja-jp/library/system.threading.monitor.enter(VS.80).aspx
Monitor.Exit メソッド
指定したオブジェクトの排他ロックを解放します。
http://msdn.microsoft.com/ja-jp/library/system.threading.monitor.exit(VS.80).aspx

ReaderWriterLock クラス
単一ライタと複数リーダーをサポートするロックを定義します。
http://msdn.microsoft.com/ja-jp/library/system.threading.readerwriterlock(VS.80).aspx

さて、どれを使うのがいいのかな?
ある本には、ReaderWriterLock クラスはlock, Monitor より遅いと出ていた。
TextWriter.Synchronized メソッドは、試してみたけどうまく動かなかった。
スレッド内部でこのメソッドを使ってはいけないのだろう。だぶん。
スレッドを開始する前に、TextWriter.Synchronized メソッドでTextWriterを生成して、使いまわすのがいいのかな。

lock か Monitor が使えるとの結論。
問題は、排他エラーになったときに、再試行を何回やったほうがいいのか?
再試行はやらないで、ファイル名を変えてもいいのか?
このあたりが悩みどころ。