That is why you don`t need synchronization objects. Threads interact with some public member functions (delegates/messages) only and they "know" nothing more about each other. So, thread's private functions are executed (handled) in it's own thread and don`t need to do anything with synchronization.
Well, I have some experiences now (did project based on queues, now planning to rewrite it to plain old locking) and I have something to say about the topic (IMO!):
Synchronization objects are simple to manage as compared to often complex race condition relations in queued systems.
IMO, this is the exactly same problem that seems to have killed microkernels.