Невозможно, чтобы компилятор Java мог эффективно использовать это. Вы можете придумать правило, согласно которому синхронизированные методы могут вызывать только методы одного и того же объекта, если они синхронизированы, но это не полезно, кроме как в довольно узких сценариях. Если getInfo()
были общедоступными, getData()
может легко вызвать другой класс, который переводит обратно на getInfo()
на исходный объект.
Кроме того, синхронизация может использоваться для отдельных операторов, а не для целых методов, а также есть other locks. Попытка разработать правила компилятора для предотвращения синхронизации кода с использованием несинхронизированных данных для всех этих случаев была бы сложной или невозможной.
На самом деле, законно хотеть вызывать метод без стоимости синхронизации в моменты, когда известно, что только поток использует объект. Решая, какие части объекта должны быть заблокированы, и когда это сложная проблема дизайна, которую может сделать только программист-программист.
Так что Java не может/не помешает вам писать код, который не является безопасным. Это все равно. Если под «системой» вы подразумеваете «компьютер», он не станет «неустойчивым». В худшем случае этот класс будет ошибкой.
Возможный дубликат: http://stackoverflow.com/questions/9525882/if-a-synchronized-method-calls-another-non-synchronized-method-is-there-a-lock – sinelaw
Синхронизация происходит по цене. –
@frostjogla, кто сказал, что компилятор пишет код? Если у вас нет идеи, оставьте ее в покое. Лучше смотреть иначе, чем что-то писать. –