3

リクエストの処理の一部として、ログに次のコードを使用しています。このコードはどこでも何度も見られます。複数の並列呼び出しを行うと、このコードが原因でデッドロックが発生します。

(defn log [msg & vals]
  (let [line (apply format msg vals)]
    (locking System/out (println line))))

ここで何がうまくいかないのか誰でも知っています。

ありがとう

4

2 に答える 2

-1

ロックのドキュメント から:

x のモニターを保持しながら、暗黙の do で exprs を実行します。すべての状況で x のモニターを解放します。

System.out の監視を保留していて、複数の並列呼び出しを取得すると、デッドロック例外が発生します。

「すべての状況で x のモニターを解放する」ということは、私には明確ではありません。

実験のために、(ロック) 関数の呼び出しを削除して、システムが引き続き機能するかどうかを確認してください。

于 2013-08-10T08:36:01.660 に答える