When two threads are running VelocimacroFactory.startRenderingMacro() simultaneously (same template), both check that templateMap is empty, then both create a new stack, then the second thread put it in templateMap, replacing the one added by the first thread.
At this time we got a stack which size == 1 instead of 2.
Then both threads endProcessingMacros(), both get stack from templateMap and check that its size is > 0, first one empty stack then second pop() macro and gets an EmptyStackException.
behavior was introduced by improvement
patch is joined, synchronize(templateMap) in VelocimacroFactory.startRenderingMacro().