Первый вариант: поле "factoryNumber " просто инкрементируется в конструкторе (строка 10), затем значение поля вызывается в строке 16. В итоге- номер этого поля в консоль выводится постоянно "2" (что неправильно)
public static class AmigoThreadFactory implements ThreadFactory {
        private static AtomicInteger factoryNumber = new AtomicInteger(0);
        private AtomicInteger threadNumber = new AtomicInteger(0);
        private ThreadGroup threadGroup;
        private String namePrefix;

        public AmigoThreadFactory() {
            SecurityManager s = System.getSecurityManager();
            threadGroup = Thread.currentThread().getThreadGroup();
            factoryNumber.getAndIncrement();
        }

        @Override
        public Thread newThread(Runnable r) {
            Thread thread = new Thread(threadGroup,r, threadGroup.getName() + "-pool-" +
                    factoryNumber.get()+"-thread-"+ threadNumber.incrementAndGet());
            thread.setDaemon(false);
            thread.setPriority(Thread.NORM_PRIORITY);
            return thread;
        }
    }
}
Второй вариант: поле "factoryNumber " инкрементируется в конструкторе (строка 10) и его значение тут же заносится в поле namePrefix, которое потом юзается для имени новой нити (строка 16). В этом случае, как и требуется, номер поля "factoryNumber " в консоль выводится то 1, то 2.
public static class AmigoThreadFactory implements ThreadFactory {
        private static AtomicInteger factoryNumber = new AtomicInteger(0);
        private AtomicInteger threadNumber = new AtomicInteger(0);
        private ThreadGroup threadGroup;
        private String namePrefix;

        public AmigoThreadFactory() {
            threadGroup = Thread.currentThread().getThreadGroup();
            namePrefix = threadGroup.getName() + "-pool-"
                    + factoryNumber.incrementAndGet() + "-thread-";

        }

        @Override
        public Thread newThread(Runnable r) {
            Thread thread = new Thread(threadGroup, r, namePrefix
                                            + threadNumber.incrementAndGet());
            thread.setDaemon(false);
            thread.setPriority(Thread.NORM_PRIORITY);
            return thread;
        }
    }
Почему так? не могу понять. Подскажите кто видит, пожалуйста