Index: src/java/org/apache/lucene/index/SegmentReader.java
===================================================================
--- src/java/org/apache/lucene/index/SegmentReader.java	(revision 674241)
+++ src/java/org/apache/lucene/index/SegmentReader.java	(working copy)
@@ -51,7 +51,8 @@
   TermVectorsReader termVectorsReaderOrig = null;
   ThreadLocal termVectorsLocal = new ThreadLocal();
 
-  BitVector deletedDocs = null;
+  volatile BitVector deletedDocs = null;
+  DeletedDocs deletedDocsProxy = createDeletedDocs();
   private boolean deletedDocsDirty = false;
   private boolean normsDirty = false;
   private boolean undeleteAll = false;
@@ -134,6 +135,24 @@
     }
   }
   
+  public synchronized BitVector getDeletedDocs() {
+    return deletedDocs;
+  }
+  
+  public class DeletedDocs {
+    public boolean isDeleted(int n) {
+      BitVector bv = getDeletedDocs();
+      return bv != null && bv.get(n);
+    }
+  }
+  
+  public class JDK15DeletedDocs extends DeletedDocs {
+    public boolean isDeleted(int n) {
+      BitVector bv = deletedDocs;
+      return bv != null && bv.get(n);
+    }
+  }
+  
   /**
    * Increments the RC of this reader, as well as
    * of all norms this reader is using
@@ -264,12 +283,50 @@
     instance.initialize(si, readBufferSize, doOpenStores);
     return instance;
   }
-
+  
+  private static String getJavaVersionTrimmed() {
+    String javaVersionString = System.getProperty("java.version");
+    if (javaVersionString != null) {
+      for (int i = 0; i < javaVersionString.length(); i++) {
+        char ch = javaVersionString.charAt(i);
+        if (ch >= '0' && ch <= '9') {
+          return javaVersionString.substring(i);
+        }
+      }
+    }
+    return null;
+  }
+  
+  private static float getJavaVersionAsFloat() {
+    String javaVersionTrimmed = getJavaVersionTrimmed();
+    if (javaVersionTrimmed == null) {
+      return 0f;
+    }
+    String str = javaVersionTrimmed.substring(0, 3);
+    if (javaVersionTrimmed.length() >= 5) {
+      str = str + javaVersionTrimmed.substring(4, 5);
+    }
+    try {
+      return Float.parseFloat(str);
+    } catch (Exception ex) {
+      return 0;
+    }
+  }
+  
+  private DeletedDocs createDeletedDocs() {
+    float javaVersion  = getJavaVersionAsFloat();
+    if (javaVersion >= 1.5) {
+      return new JDK15DeletedDocs();
+    } else {
+      return new DeletedDocs();
+    }
+  }
+  
   private void initialize(SegmentInfo si, int readBufferSize, boolean doOpenStores) throws CorruptIndexException, IOException {
     segment = si.name;
     this.si = si;
     this.readBufferSize = readBufferSize;
-
+    
     boolean success = false;
 
     try {
@@ -669,8 +726,9 @@
     return fieldsReader.doc(n, fieldSelector);
   }
 
-  public synchronized boolean isDeleted(int n) {
-    return (deletedDocs != null && deletedDocs.get(n));
+  public boolean isDeleted(int n) {
+    return deletedDocsProxy.isDeleted(n);
+    //return (deletedDocs != null && deletedDocs.get(n));
   }
 
   public TermDocs termDocs() throws IOException {
