The lock ordering leaves open the possibility of a deadlock if one thread is fetching on a receiver, another is accepting messages received by it and a third is closing the receiver.
Thread 1 holds SessionImpl's lock and is blocked on IncomingMessage's lock. Thread 2 holds IncomingMessage's lock and is blocked on ReceiverImpl's lock. Thread 3 holds the ReceiverImpl's lock and is blocked on SessionImpl's lock.
I have been unable to reproduce this myself, but an actual incidence has been reported: https://bugzilla.redhat.com/show_bug.cgi?id=703891