Index: lucene/core/src/java/org/apache/lucene/index/SerialMergeScheduler.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/index/SerialMergeScheduler.java	(revision 1536346)
+++ lucene/core/src/java/org/apache/lucene/index/SerialMergeScheduler.java	(working copy)
@@ -18,26 +18,36 @@
  */
 
 import java.io.IOException;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 /** A {@link MergeScheduler} that simply does each merge
  *  sequentially, using the current thread. */
 public class SerialMergeScheduler extends MergeScheduler {
 
+  private final Lock lock = new ReentrantLock();
+
   /** Sole constructor. */
   public SerialMergeScheduler() {
   }
 
-  /** Just do the merges in sequence. We do this
-   * "synchronized" so that even if the application is using
-   * multiple threads, only one merge may run at a time. */
+  /** Just do the merges in sequence. The calling thread will try to obtain a
+   * lock before it pulls a pending merge from the IndexWriter. If the thread
+   * can't obtain the lock it will return immediately. Even if the application is using
+   * multiple threads, only one merge may run at a time.  */
   @Override
-  synchronized public void merge(IndexWriter writer) throws IOException {
-
-    while(true) {
-      MergePolicy.OneMerge merge = writer.getNextMerge();
-      if (merge == null)
-        break;
-      writer.merge(merge);
+  public void merge(IndexWriter writer) throws IOException {
+    if (lock.tryLock()) { // no need to block if that lock is taken
+      try {
+        while(true) {
+          MergePolicy.OneMerge merge = writer.getNextMerge();
+          if (merge == null)
+            break;
+          writer.merge(merge);
+        }
+      } finally {
+        lock.unlock();
+      }
     }
   }
 
