summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/IteratorSeq.java34
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;
}
}