Skip to content

Instantly share code, notes, and snippets.

@hiredman
Created March 23, 2021 20:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hiredman/6c111db73ac020e1a234e0361e2e067a to your computer and use it in GitHub Desktop.
Save hiredman/6c111db73ac020e1a234e0361e2e067a to your computer and use it in GitHub Desktop.
(set! *warn-on-reflection* true)
(defonce ref-ids (atom 0))
(declare ^java.util.concurrent.atomic.AtomicReferenceFieldUpdater ref-updater)
(deftype ARef [id
^:volatile-mutable value
offers]
clojure.lang.IDeref
(deref [_]
(loop [i 0]
(let [v value]
(if (identical? v not-defined)
(do
(Thread/sleep (Math/pow 2 i))
(recur (inc i)))
v))))
clojure.lang.IFn
(invoke [_]
(java.util.concurrent.atomic.AtomicReferenceFieldUpdater/newUpdater
ARef
Object
"value")))
(def ^java.util.concurrent.atomic.AtomicReferenceFieldUpdater ref-updater ((fn [] ((->ARef nil nil nil)))))
(defn ref-get [r]
(.get ref-updater r))
(defn make-ref [init]
(->ARef (swap! ref-ids inc)
init
(java.util.concurrent.LinkedBlockingQueue.)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment