Является ли sun.misc.Unsafe общедоступным в JDK9?

Только что попробовал JDK9 и обнаружил, что sun.misc.Unsafe теперь содержит не нативный метод, а делегирует их какому-то jdk.internal.misc.Unsafe, например:

@ForceInline
public int getInt(Object o, long offset) {
    return theInternalUnsafe.getInt(o, offset);
}

Последний, в свою очередь, выглядит фактически как старый sun.misc.Unsafe, но теперь методы снабжены некоторой аннотацией:

@HotSpotIntrinsicCandidate
public native void putObject(Object o, long offset, Object x);

Итак, безопасно ли использовать Unsafe при запуске JDK9? Это официальный публичный API?


person Саша Данилин    schedule 16.10.2017    source источник


Ответы (2)


Вот хорошее объяснение:

https://adtmag.com/blogs/watersworks/2015/08/java-9-hack.aspx

Что делать с sun.misc.Unsafe в Java 9? Одна сторона говорит, что это просто ужасная поделка из недобрых старых дней, от которой нужно избавиться; другая сторона говорит, что его интенсивное использование ответственно за подъем Java в инфраструктурном пространстве, и популярные инструменты все еще нуждаются в нем. Проблема в том, что обе стороны правы. ...

В своем письме для списка рассылки OpenJDK Рейнхольд предложил инкапсулировать неподдерживаемые внутренние API, включая sun.misc.Unsafe, в модули, которые их определяют и используют. Это предложение теперь является официальным предложением по улучшению Java (JEP). Опубликованный на этой неделе документ JEP 260 (Incapsulate Most Internal APIs) направлен на то, чтобы сделать большинство внутренних API JDK недоступными по умолчанию, но оставить доступными некоторые критически важные, широко используемые внутренние API, пока не появятся поддерживаемые замены для всех или большей части их функций.

Краткий ответ: вы НЕ должны использовать его в любом новом приложении, которое вы разрабатываете с нуля.

person paulsm4    schedule 16.10.2017
comment
Краткий ответ: вы не должны его использовать. - person user207421; 16.10.2017
comment
Не используйте его намеренно сами ... Но не паникуйте, если вам случится увидеть его в каком-то другом коде;) - person paulsm4; 16.10.2017

Объяснение @paulsm4 достаточно хорошо, чтобы знать, использовать его дальше или нет.

Длинный ответ ~ JEP 260: инкапсулировать большинство внутренних API< /сильный>


Почему они решили отказаться от поддержки давно используемого API?

Полезность

В модульном JDKJEP 200, ограничение доступа к нестандартным, нестабильным и неподдерживаемым API, которые являются внутренними деталями реализации JDK, путем использования Система модулейJEP 261 улучшает целостность и безопасность платформы, поскольку многие из этих внутренних API определяют привилегированные, чувствительные к безопасности операции. В долгосрочной перспективе это изменение уменьшит расходы, которые несут специалисты по сопровождению самого JDK, а также библиотек и приложений, которые сознательно или нет используют эти внутренние API.


Планируется ли инкапсулировать все внутренние API?

Категории

Указанные выше внутренние API JDK делятся на две широкие категории:

  • Некритические внутренние API, которые не используются кодом за пределами JDK или используются внешним кодом просто для удобства.

  • Критически важные внутренние API, предоставляющие критически важные функции, которые было бы трудно, если вообще возможно, реализовать за пределами самого JDK (например, sun.misc.Unsafe).


Что, если кто-то переносит код, который уже использует Unsafe, но в конечном итоге планирует отказаться от него?

sun.misc.Unsafe

Это один из тех критически важных внутренних API, которые не инкапсулированы в JDK 9, потому что в JDK 8 не существовало поддерживаемых замен, в то время как большинство других API инкапсулированы или объявлены устаревшими, чтобы быть удаленными в будущих выпусках.

Является ли sun.misc.Unsafe общедоступным в JDK9?

  • Использование

    В настоящее время для доступа к критически важным внутренним API, таким как Unsafe, необходимо определить зависимость от модуля jdk.unsupported, который определен специально для этой цели:

    module jdk.unsupported {
        exports sun.misc;
        opens sun.misc;
        ...
    }
    

Сколько бы он ни мог ответить на ваш вопрос, вы не найдете этот модуль задокументировано даже, вероятно, для того, чтобы запретить потребителям использовать его, и явным признаком того, что его избегают, чтобы сделать его "общедоступным".

person Naman    schedule 17.10.2017