I agree that is still an issue.. Interestingly I have had to do something very similar with the queueing I am using for the cluster listeners but I don't have a compound value, and mine uses a queue.

           `queue.add(new ImmortalCacheEntry(k, value));
            if (insertionCount.incrementAndGet() % batchSize == 0) {
               Collection<Map.Entry<K, C>> entriesToSend = new ArrayList<Map.Entry<K, C>>(batchSize);
               // Only let a single thread in here to remove values
               synchronized (queue) {
                  while (entriesToSend.size() != batchSize) {
                     entriesToSend.add(queue.poll());
                  }
               }
               // Process the new collection
            }
`

I assume the combiner wants to have keys processed together though ?  If so maybe a PriorityBlockingQueue or something could be useful to guarantee you keep similar keys together.