« Back to Index
Clojure Thread State
View original Gist on GitHub
Clojure Thread State.clj
(def current-account (ref 500))
(def savings-account (ref 600))
(println (str "current-account:" current-account))
(println (str "savings-account:" savings-account))
(defn withdraw [from constraint amount]
(dosync
(let [total (+ @from (ensure constraint))]
(Thread/sleep 1000)
(println (str (Thread/currentThread) " - " (.isInterrupted (Thread/currentThread)) "\n"))
(println (str (Thread/currentThread) " - " (.getState (Thread/currentThread)) "\n"))
(println (str (Thread/currentThread) " - " (.getPriority (Thread/currentThread)) "\n"))
(if (>= (- total amount) 1000)
(alter from - amount)
(println "Sorry, can't withdraw due to constraint violation\n")))))
(println "STATE BEFORE MODIFYING")
(println "Current Account balance is" @current-account)
(println "Savings Account balance is" @savings-account)
(println "Total balance is" (+ @current-account @savings-account))
(future (withdraw current-account savings-account 100))
(future (withdraw savings-account current-account 100))
(Thread/sleep 4000)
(println "STATE AFTER MODIFYING")
(println "Current Account balance is" @current-account)
(println "Savings Account balance is" @savings-account)
(println "Total balance is" (+ @current-account @savings-account))