मान लीजिए कि आपके कुछ बैंक खाते हैं:
(def accounts
[(ref 0)
(ref 10)
(ref 20)
(ref 30)])
और एक परमाणु "हस्तांतरण" समारोह:
(defn transfer [src-account dest-account amount]
(dosync
(alter dest-account + amount)
(alter src-account - amount)))
जो निम्नानुसार काम करता है:
(transfer (accounts 1) (accounts 0) 5)
(map deref accounts)
=> (5 5 20 30)
आप उच्च स्तरीय लेनदेन बनाने के लिए आसानी से हस्तांतरण समारोह की रचना कर सकते हैं, उदाहरण के लिए कई खातों से स्थानांतरण के लिए:
(defn transfer-from-all [src-accounts dest-account amount]
(dosync
(doseq [src src-accounts]
(transfer src dest-account amount))))
(transfer-from-all
[(accounts 0) (accounts 1) (accounts 2)]
(accounts 3)
5)
(map deref accounts)
=> (0 0 15 45)
ध्यान दें कि सभी कई हस्तांतरण एक एकल, संयुक्त लेनदेन में हुए, यानी छोटे लेनदेन को "बनाना" संभव था।
ताले के साथ ऐसा करने के लिए बहुत जल्दी जटिल हो जाएगा: व्यक्तिगत रूप से लॉक होने के लिए आवश्यक खातों को संभालने के बाद आपको लॉक अधिग्रहण आदेश पर एक प्रोटोकॉल स्थापित करने की आवश्यकता होगी ताकि गतिरोध से बचा जा सके। एक मुश्किल से पता लगाने की गलती करना बहुत आसान है। एसटीएम आपको इस सभी दर्द से बचाता है।