In my application, I have a large number of threads in the broker, which are calling dispatchPending() on their subscriptions, but are unable to make fast progress, as can be seen in the following stack trace: "ActiveMQ Transport: tcp:///" daemon prio=4 tid=0x4be82000 n id=0x1028 waiting for monitor entry [0x54fdf000..0x54fdfb00] java.lang.Thread.State: BLOCKED (on object monitor) at - locked <0x0a60bf58> (a java.lang.Object) at at at - locked <0x0b55bd78> (a java.lang.Object) at at at at at at at at at org.apache.activemq.command.MessageAck.visit( .... I am trying to understand why IndirectMessageReference.lock() would require synchronisation on the entire Queue object it is associated with? This is why the performance in my application is grinding... each time a prefetch/queue subscription is testing to see if they can dispatch a message, we are effectively serialising on the Queue object. Any ideas on how we can fix this? I have some ideas, but thought the experts are better qualified. :) This became evident when I had 20 consumers hammering away. With 2, you'd never see this. Cheers, David