我正在尝试向服务器发送请求。每个请求都由一个整数引用。服务器只响应按升序排列的请求 - 也就是说,如果我发送请求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再次递增原子并以某种方式首先联系服务器?避免这种情况的最佳方法是什么?
谢谢,
答案 0 :(得分:1)
Clojure与synchronized
的等效构造是locking,可以基本相同的方式使用:
(locking some-lock
(let [r (.incrementAndGet requestId)]
(.sendRequest socket r other_parameters)))
some-lock
是您要锁定的对象。我不确定在没有this
的情况下你想要的是什么。