У вас синхронизация производится по workToDoNext, а в это время workToDoNow не залочен.
Вообще тут общих советов не дать. Thread-safe это целая наука — надо видеть намного большую часть вашего кода, чтобы подсказать что-либо конкретное. Про синхронизацию потоконебезопасных коллекций есть глава в Java Concurrency in Practice.
Извините не дописал.
2) от сервака в интернет пропускаю только established пакеты
Если нужно взаимодействие с локальной сетью, то также
из локальной сети до сервака только нужные порты
из DMZ к локальной сети только established пакеты