2017-12-14 11 views
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))) 

は​​へ

答えて

1

のClojureの同等の構造は基本的に同じように使用することができ、lockingで、ありがとうございます。 thisがないと、あなたはそれが欲しいとは思っていません。

+0

ありがとうございます!私はrefを考えましたが、これを理論的には何度かサーバーに要求を送ることができた可能性があります。 (ロック)は私が必要としているものとまったく同じです。 – alex314159

関連する問題