Где и как подтянуть теорию по некоторым темам Java Core?
По Multithreading 
"Что выведет следующий фрагмент кода"
Это - самый плохой класс задач на мультипоточку. Я видел много таких. Большинство из них основаны на Race Conditions и бывало и такое что негативный эффект не воспроизводится хотя и ожидается в задаче. А не воспроизводится по тесяче причин. По другой операционке или по другой версии JDK/JRE. Вобщем что
выведет код нужно выкинуть и заменить его на какой-то модульный тест да и еще и под нагрузкой. И беря 
во внимание комплексность самого вопроса я-бы не стал такое выводить например в собеседования. Так
можно и мидла макнуть головой в сортир.  Попробуйте распознать в коде например задачу обедающих
философов. Я готов спорить на коньяк что если вы никогда не слыхали - то не распознаете подвох.

Где и как подтянуть теорию Multithreading(М). Ответ - нигде. Самый лучший вариант - начать писать много кода
с мультипоточкой и наблюдать.  Очень многие эффекты книги не объясняют. И 99% новичек нигде не прочитает
про разницу между использованием synchronized и atomic. 

Вобщем берите код с нагрузкой и наблюдайте.
Могу посоветовать почитать книжек по джаве и паралельно в любое свободное время слушать лекции
Collections Framework, Multithreading и ООП в любом из классиков Эккель/Хорстман/Шилдт.
По спрингу Spring in Action хвалят. Есть еще монструозная книжка "Spring для профессионалов", как по мне не очень хорошо написанная.
По многопоточности можно еще Java concurency in practice почитать, но это вроде как адвансед уровень уже.