diff options
author | Rich Hickey <richhickey@gmail.com> | 2007-06-19 13:11:57 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2007-06-19 13:11:57 +0000 |
commit | 1908c0e93935986d20bc64c9325a5158729348e0 (patch) | |
tree | d0033eb16d637bb93281d5f1c7d9b71a81c9c574 /src/jvm/clojure | |
parent | ccf5c095673f0811d23d13e1cf458e9e29b88c41 (diff) |
switched to volatile/double-checked lock
Diffstat (limited to 'src/jvm/clojure')
-rw-r--r-- | src/jvm/clojure/lang/IteratorSeq.java | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/src/jvm/clojure/lang/IteratorSeq.java b/src/jvm/clojure/lang/IteratorSeq.java index 20102034..8cc5d70d 100644 --- a/src/jvm/clojure/lang/IteratorSeq.java +++ b/src/jvm/clojure/lang/IteratorSeq.java @@ -13,9 +13,9 @@ package clojure.lang; import java.util.Iterator;
public class IteratorSeq extends ASeq{
-Iterator iter;
-Object val;
-ISeq _rest;
+final Iterator iter;
+volatile Object val;
+volatile ISeq _rest;
public static IteratorSeq create(Iterator iter){
if(iter.hasNext())
@@ -30,23 +30,25 @@ IteratorSeq(Iterator iter){ }
public Object first(){
- synchronized(this)
- {
- if(val == this)
- val = iter.next();
- return val;
- }
+ if(val == this)
+ synchronized(this)
+ {
+ if(val == this)
+ val = iter.next();
+ }
+ return val;
}
public ISeq rest(){
- synchronized(this)
- {
- if(_rest == this)
+ if(_rest == this)
+ synchronized(this)
{
- first();
- _rest = create(iter);
+ if(_rest == this)
+ {
+ first();
+ _rest = create(iter);
+ }
}
- return _rest;
- }
+ return _rest;
}
}
|