It depends a lot on your use-case. As Sachin said, you could use one of the BlockingQueues, which are most appropriate for a publish/consume scenario, where some Threads puts things into the Queue and others takes them out.
Another option if you have multiple threads that both publish into and consume from the queue would be to do what the 'Synchronized' collections do (like Vector, Hashtable, and those returned from Collections.synchronizedXXX() methods), which is to synchronize all access methods to the Queue which prevents simultaneous gets and puts. If you do this, you might think about using the Collections.synchronizedCollection() method - maybe it is good enough. Otherwise I would write a wrapper Object. But like you said, all access will be done one at a time which can slow things down when there are a lot of simultaneous accesses, and iterating over the collection would not be thread safe - you would have to add additional synchronization.
The third option would be to use a class like ConcurrentLinkedQueue which allows concurrent access to the queue in a thread safe, non-blocking manner. This also requires Java 1.5+