Поскольку поле 'x' не объявлено как volatile, JVM не требует, чтобы 'x' было видимым для всех других потоков. То есть если один поток постоянно читает значение 'x', а другой поток пишет его, возможно, что поток чтения никогда не "увидит" изменение значения.
Синхронизированное ключевое слово не требуется, но оно будет работать, так как оно создаст необходимый барьер памяти / очистку кэша, чтобы обеспечить видимость «x», но использование ключевого слова volatile в этом случае будет более эффективным.