I found that the best class to use for queues in a multithread context is the set of BlockingQueues.
Good to hear you have found a solution.

No need to synchronize and it is possible to put the thread in wait mode (using the take() method) until new items are posted to the queue (using add() or put() methods).
Yes, if you using these blocking methods there is no need to provide any synchronization because it is handled internally for you.