diff options
Diffstat (limited to 'src')
-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;
}
}
|