« 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))