Перерыв несколько статей, я понял что у каждого ядра есть свой КЭШ
Несколько кэшей. Причём некоторые из кэшей могут делиться между несколькими ядрами.
Что будет, если переменная не синхронизирована или не помечена как volatile
Непредсказуемое поведение будет, зависящее от конкретного железа и кучи других факторов.
Поэтому, исходя из двух предыдущих пунктов, лучше не лезть на железный уровень, если не пишешь драйвер, а оперировать соответствующими высокоуровневыми моделями языка программирования и среды выполнения. Тем более, что
volatile решает не только проблемы видимости.