У меня нет времени, чтобы проверить источник println, будьте уверены, что он всегда безопасен для потоков (вы могли бы, если бы захотели), но вы уверены, что ваш println неверен?Вполне может быть, что код выполняется в совсем другое время, чем вы думаете.Потоки часто зацикливаются на блокировках или просто забываются планировщиком, поэтому то, что вы думаете, должно запускать A, B, C, D, может запускать B, C, D, A. Тогда вы удивляетесь, почему println испортился, печатая последниеты думаешь побежал первым.И это действительно простой пример.Разница между тем, что вы ожидаете от многопоточности, и тем, что происходит, может быть поразительной.Как правило, чем выше отношение потока к сердечнику, тем хуже оно.Одноядерные машины всегда делают все противоположное тому, что вы ожидаете.
И вам даже не нужно несколько потоков, чтобы иметь эту проблему.Мои первые потрясения были связаны с очередями событий (в Windows 3.1), которые не разделяли мои взгляды на время запуска.Мне потребовалось некоторое время, чтобы понять, что сообщения были зашифрованы, потому что ОС имела совершенно другое представление о том, как они должны работать, чем я.
В System.out.println и flush вполне могут быть некоторые тонкостио котором я не знаю, но даже когда у вас все это работает, имейте в виду, что эти темы имеют довольно противоречивые собственные умы.Даже Logger не решит все ваши проблемы.