clojure/core commute

点我查看原文及更多示例

(ns $clojureDoc.core.commute)
;; 使用方式:(commute ref fun & args)
;; Must be called in a transaction. Sets the in-transaction-value of
;; ref to:
;;  (apply fun in-transaction-value-of-ref args)
;;  and returns the in-transaction-value of ref.
;;  At the commit point of the transaction, sets the value of ref to be:
;;  (apply fun most-recently-committed-value-of-ref args)
;;  Thus fun should be commutative, or, failing that, you must accept
;; last-one-in-wins behavior.  commute allows for more concurrency than
;; ref-set.
;; 必须应用在事务中
;; 设定事务中的值引用:
;; 返回(apply fun in-transaction-value-of-ref args)的结果
;; 在事务提交时,设定ref的值为:(apply fun most-recently-committed-value-of-ref args)
;; 因此,commute函数会执行两次
;; 然而函数fun应该是可交换的,否则返回失败,必须处理
;; commute允许多个并发

;; sleep-print-update返回一个函数,接收一个state参数
(defn sleep-print-update
  [sleep-time thread-name update-fn]
  (fn [state]
    (Thread/sleep sleep-time)
    (println state)
    (println (str thread-name ": " state))
    (update-fn state)
    )
  )

(def counter (ref 2))

(future (dosync (commute counter (sleep-print-update 100 "Commute Thread A" inc))))
(future (dosync (commute counter (sleep-print-update 150 "Commute Thread B" inc))))
;; 输出
;; 2
;; Commute Thread A: 2
;; 2
;; Commute Thread B: 2
;; 2
;; Commute Thread A: 2
;; 3
;; Commute Thread B: 3

;; REPL中运行看出效果
;(def savings-ref-stand (ref {:balance 500}))
;(def checking-ref-stand (ref {:balance 250}))
;(:balance @savings-ref-stand)
;;; => 500
;(:balance @checking-ref-stand)
;;; => 250
;(dosync
;  (commute checking-ref-stand assoc :balance 700)
;  (throw (Exception. "Oops..."))
;  (commute savings-ref-stand assoc :balance 50)
;  )
;(:balance @savings-ref-stand)
;;; => 500
;(:balance @checking-ref-stand)
;;; => 250

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangningboo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值