Я не могу проверить это прямо сейчас, но как насчет:
volatile boolean closed = false;
public void offer(T item) {
if ( !closed ) {
synchronized (queue) {
queue.add(item);
if ( item == null ) {
closed = true;
}
}
// Not sure if this should be outside or inside the if.
LockSupport.unpark(thread);
}
}
Добавлено : Я думаю, что единственным побочным эффектом состояния гонки здесь будет возможностьнебольшое количество дополнительных элементов, отправляемых в очередь после нуля.До тех пор, пока вы обращаетесь с этим (что вам кажется) у вашего потребителя, проблем не должно быть.Однако, если это было проблемой, вы могли бы сделать:
volatile boolean closed = false;
public void offer(T item) {
if ( !closed ) {
synchronized (queue) {
if ( !closed ) {
queue.add(item);
if ( item == null ) {
closed = true;
}
}
}
// Not sure if this should be outside or inside the if.
LockSupport.unpark(thread);
}
}