Good catch. Getting concurrency right is usually not easy.
I can image that poll() was used instead of take() because of the done boolean, ie. they wanted the non-blocking semantic of poll() here.
One could increase the synchronized block for both methods so that includes the put and poll methods. Of course, then you wouldn't need any concurrent datastructe and could simply use a Queue.
I could image there is a better solution.