【问题标题】:Clojure - synchronised blockClojure - 同步块
【发布时间】:2017-12-14 15:05:05
【问题描述】:

我正在尝试向服务器发送请求。每个请求都由一个整数引用。服务器只会响应按升序排列的请求——也就是说,如果我发送请求 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 是否可以增加 atom,但是当 send-request 函数发送请求时,线程 2 会再次增加 atom 并以某种方式首先联系服务器?避免这种情况的最佳方法是什么?

谢谢,

【问题讨论】:

    标签: clojure synchronization


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!我想到了 ref 但是阅读文档这在理论上可以将请求多次发送到服务器,这可能是一个问题。 (锁定)似乎正是我所需要的。
    猜你喜欢
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2015-05-25
    • 1970-01-01
    相关资源
    最近更新 更多