#java #jvm #short
#java #jvm #короткое
Вопрос:
Одно из моих приложений решило сегодня вернуть 1, когда
Short.valueOf("0")
был вызван.
Я обнаружил, что
ShortCache.cache[128]
было установлено значение 1 вместо 0, другие кэшированные значения были правильными.
Вот как инициализируется кэш:
private static class ShortCache {
private ShortCache(){}
static final Short cache[] = new Short[-(-128) 127 1];
static {
for(int i = 0; i < cache.length; i )
cache[i] = new Short((short)(i - 128));
}
}
Каковы возможные сценарии, чтобы это произошло?
Комментарии:
1. Это может произойти, если вредоносная библиотека или фрагмент кода (или коллега с неуместным чувством юмора) изменили кэш, например, см. Добавить энтропию в вашу JVM
2. Я видел это в видео youtube.com/watch?v=amXXYgu0eFY похоже, что что-то изменяет кеш.
3. @MarkRotteveel и Джон Мерсье: это действительно было бы неприятно. Однако, поскольку изображение, содержащее это приложение, запущено в нескольких средах, и до сих пор это происходило только один раз (и перезапуск исправил это), мне было интересно, мог ли какой-либо процесс, отличный от Java, внутри или вне контейнера, изменить значение, на которое ссылается данный Short .
4. Хотя это возможно, я думаю, что такое внешнее повреждение было бы еще менее вероятным.