Index: src/java/org/apache/lucene/index/DocumentsWriter.java
===================================================================
--- src/java/org/apache/lucene/index/DocumentsWriter.java	(revision 1060122)
+++ src/java/org/apache/lucene/index/DocumentsWriter.java	(working copy)
@@ -147,7 +147,7 @@
     this.perThreadPool.initialize(this);
   }
 
-  boolean deleteQueries(final Query... queries) throws IOException {
+  synchronized boolean deleteQueries(final Query... queries) throws IOException {
     Iterator<ThreadState> threadsIterator = perThreadPool.getActivePerThreadsIterator();
 
     boolean deleted = false;
@@ -177,7 +177,7 @@
     return deleteQueries(query);
   }
 
-  boolean deleteTerms(final Term... terms) throws IOException {
+  synchronized boolean deleteTerms(final Term... terms) throws IOException {
     Iterator<ThreadState> threadsIterator = perThreadPool.getActivePerThreadsIterator();
 
     boolean deleted = false;
@@ -207,7 +207,7 @@
     return deleteTerms(term);
   }
 
-  boolean deleteTerm(final Term term, ThreadState exclude) {
+  synchronized boolean deleteTerm(final Term term, ThreadState exclude) {
     Iterator<ThreadState> threadsIterator = perThreadPool.getActivePerThreadsIterator();
 
     boolean deleted = false;
@@ -404,8 +404,13 @@
 
     SegmentInfo newSegment = null;
     SegmentDeletes segmentDeletes = null;
-
-    ThreadState perThread = perThreadPool.getAndLock(Thread.currentThread(), this, doc);
+    ThreadState perThread = null;
+    synchronized (this) {
+      if (delTerm != null) {
+        deleteTerm(delTerm, perThread);
+      }
+      perThread = perThreadPool.getAndLock(Thread.currentThread(), this, doc);
+    }
     try {
       DocumentsWriterPerThread dwpt = perThread.perThread;
       long perThreadRAMUsedBeforeAdd = dwpt.bytesUsed();
@@ -434,12 +439,6 @@
       return true;
     }
 
-    // delete term from other DWPTs later, so that this thread
-    // doesn't have to lock multiple DWPTs at the same time
-    if (delTerm != null) {
-      deleteTerm(delTerm, perThread);
-    }
-
     return false;
   }
 
