Clojure - 同步块

时间:2017-12-14 15:05:05

标签: clojure synchronization

我正在尝试向服务器发送请求。每个请求都由一个整数引用。服务器只响应按升序排列的请求 - 也就是说,如果我发送请求7然后请求6,它将忽略请求6.我在多线程环境中工作,其中多个线程可以同时发送请求。在Java中,我用这种方式解决了问题:

synchronized(this){
   r = requestId.incrementAndGet();//requestId is an AtomicInteger
   socket.sendRequest(r, other_parameters);
}

在Clojure中,我考虑将request-id定义为Atom并执行以下操作:

(send-request socket (swap! request-id inc) other-parameters)

这是否有效或是否可能线程1递增原子,但是当发送请求函数发送请求时,线程2再次递增原子并以某种方式首先联系服务器?避免这种情况的最佳方法是什么?

谢谢,

1 个答案:

答案 0 :(得分:1)

Clojure与synchronized的等效构造是locking,可以基本相同的方式使用:

(locking some-lock
  (let [r (.incrementAndGet requestId)] 
    (.sendRequest socket r other_parameters)))

some-lock是您要锁定的对象。我不确定在没有this的情况下你想要的是什么。