1
要求をサーバーに送信しようとしています。各要求は整数で参照されます。サーバーは、昇順で来る要求にのみ応答します。つまり、要求7を送信してから要求6を送信すると、要求6は無視されます。複数のスレッドが同時に要求を送信できるマルチスレッド環境で作業しています。Clojure同期ブロック
(send-request socket (swap! request-id inc) other-parameters)
がその作業を行うかであることの可能なスレッド:Clojureので
synchronized(this){
r = requestId.incrementAndGet();//requestId is an AtomicInteger
socket.sendRequest(r, other_parameters);
}
が、私はアトムとして要求IDを定義すると、次のことについて考えた:Javaでは、私はこの問題をこの方法で解決しました1はアトムをインクリメントしますが、send-request関数が要求を送信するまでに、スレッド2はアトムを再度インクリメントし、何らかの方法でサーバーに接続します。このようなシナリオを避ける最善の方法は何ですか?
some-lock
あなたがロックオンしているオブジェクトです
(locking some-lock
(let [r (.incrementAndGet requestId)]
(.sendRequest socket r other_parameters)))
:
はへ
ありがとうございます!私はrefを考えましたが、これを理論的には何度かサーバーに要求を送ることができた可能性があります。 (ロック)は私が必要としているものとまったく同じです。 – alex314159