Это может быть потому, что у вас есть изменения в тех файлах, которые не зафиксированы.
Попробуйте:
cd /home/poojat/go/src/golang.org/x/tools
git checkout .
git clean -fd
Ни один readonly
ни volatile
модификаторы являются проникающими. Они относятся к самой ссылке, не свойствам объекта.
readonly
ключевое слово утверждает — и осуществляет — который переменная не может изменить после инициализации. Переменная является маленьким блоком памяти, где ссылка хранится.
volatile
ключевое слово говорит компилятору, что содержание переменной могло бы быть изменено несколькими потоками. Это препятствует тому, чтобы компилятор использовал оптимизацию (такую как чтение значения переменной в регистр и использование того значения по нескольким инструкциям), который мог бы вызвать проблемы с параллельным доступом. Снова, это только влияет на маленький блок памяти, где ссылка хранится.
Примененный этот путь, Вы видите, что они являются действительно взаимоисключающими. Если что-то только для чтения (может только быть записан в однажды, при инициализации или конструкции), то это не может также быть энергозависимо (может быть записан в в любое время несколькими потоками).
Что касается Вашей озабоченности по поводу кэширования проблем, IIRC, существуют довольно строгие правила о том, когда компилятор может кэшировать результат вызова свойства. Следует иметь в виду, что это - вызов метода, и это - довольно тяжелая оптимизация (с точки зрения компилятора) для кэширования ее значения и пропуска, называя его снова. Я не думаю, что это - что-то, чем необходимо коснуться себя чрезмерно очень.
Поле только для чтения может только быть записано, когда объект сначала создается. Поэтому не будет никакой проблемы кэширования о ЦП, потому что поле неизменно и не может возможно измениться.
В то время как сама ссылка могла бы быть ориентирована на многопотоковое исполнение, ее свойства не могли бы. Думайте о том, что произошло бы, если бы два потока пытались одновременно выполнить итерации через Список, содержавший в Вашем ссылочном объекте.