Что такое небезопасенный класс?
Java была первоначально разработана как безопасная управляемая среда. Несмотря на это, Java Hotspot по-прежнему включает в себя «бэкдор», который обеспечивает некоторые низкоуровневые операции, которые могут непосредственно манипулировать памятью и потоками. Этот класс Backdoor - sun.misc.unsafe - широко используется в своих собственных пакетах JDK, такими как java.nio и java.util.concurrent. Тем не менее, этот бэкдор вообще не рекомендуется в производственных средах. Потому что этот API очень небезопасен, не легкий и нестабильный. Этот небезопасенный класс обеспечивает представление о внутренней структуре горячей точки JVM и может быть изменен. Иногда его можно использовать для изучения внутренней структуры виртуальной машины без отладки C ++, а иногда его можно использовать в качестве инструментов мониторинга производительности и разработки.
введение
Недавно я смотрел на исходный код параллельных пакетов Java и обнаружил волшебный небезопасный класс. Я тщательно изучил его и поделился с вами здесь.
Небезопасный класс находится под пакетом Sun.misc и не принадлежит стандарту Java. Тем не менее, многие базовые библиотеки класса Java, в том числе некоторые широко используемые библиотеки развития высокопроизводительного развития, разработаны на основе небезопасного класса, таких как Netty, Cassandra, Hadoop, Kafka и т. Д. Небезопасный класс играет большую роль в повышении эффективности работы Java и повышении базовых операций на языке Java.
Небезопасный класс дает Java возможность управлять пространством памяти, как указатели на языке C, а также вызывает проблемы с указателями. Чрезмерное использование небезопасного класса увеличит вероятность ошибок, поэтому Java не рекомендует его использовать, и почти нет официальной документации. Oracle планирует удалить небезопасную класс из Java 9, и если это так, это было бы слишком большим.
Обычно лучше не использовать небезопасную класс, если у него нет четкой цели, а также не имеет углубленного понимания этого. Чтобы использовать небезопасную класс, вам нужно использовать несколько сложных методов. Небезопасный класс использует синглтонский шаблон и должен быть получен с помощью статического метода getunsafe (). Тем не менее, небезопасный класс ограничил его. Если это нормальный вызов, он вызовет исключение Security Exception; Только класс, загруженный основным загрузчиком класса, может вызвать этот метод. Исходный код заключается в следующем:
public static untabe getunsafe () {class var0 = Reflection.getCallerclass (); if (! vm.issystemdomainloader (var0.getClassloader ())) {бросить новое безопасное Exception ("небезопасно"); } else {return theunsafe; }}Есть также несколько способов загрузить код пользователя с помощью основного загрузчика класса, таких как настройка параметра BootClassPath. Но более простой способ - использовать Java Reflection следующим образом:
Поле F = uncefe.class.getDeclaredfield ("theunsafe"); f.setAccessible (true); Небезопасно небезопасно = (небезопасно) f.get (null);После получения небезопасного экземпляра мы можем сделать все, что хотим. Небезопасный класс предоставляет следующие функции:
1. Управление памятью. В том числе распределение памяти, освобождения памяти и т. Д.
Эта часть включает в себя Allocatememory (Allocatememory), Reallocatememory (Reallocatememory), Copymemory (копия памяти), Freememory (Free Memory), GetAddress (getget memorysemed), Addressize, Paterize, GetInt (Получите INTEGERTINGE, на адрес, ADDRATILE (GETINTVOLATILE (Получите INTEGER ARDERE -ARDERE -ARDERE -INTEGER, чтобы нанести на вспомогательную память и запомнить, чтобы нанести на вопрос, который будет вынесен на вопрос, который будет вынесен на вопрос, который будет вынесен на вопрос, который будет вынесен на порядок Семантика), PUTINT (запишите целое число на указанный адрес памяти), PUTINTVOLATILE (запишите целое число на указанный адрес памяти и поддерживает летучую семантику), PUTORDERENT (запишите целое число на указанный адрес памяти, упорядоченные или отсроченные методы). GETXXX и PUTXXX содержат различные основные типы операций.
Используя метод Copymemory, мы можем реализовать общий метод копии объекта без реализации метода клона для каждого объекта. Конечно, этот общий метод может достичь только мелкого копирования объекта.
2. Неотрациональная инстанция объекта.
Метод AllocateInstance () обеспечивает другой способ создания экземпляра. Обычно мы можем создавать создание объектов с новым или отражением. Используйте метод AllocateInstance () для непосредственного генерации экземпляров объектов без вызова конструкторов и других методов инициализации.
Это полезно при десериализации объектов, что позволяет восстановить и устанавливать окончательные поля без вызова конструкторов.
3. Операционные классы, объекты и переменные.
Эта часть включает в себя staticfieldoffset (смещение статического домена), DefineClass (Conitirect Class), DefineAnonymousClass (определение анонимного класса), EnsureClassInitialize (обеспечить инициализацию класса), ObjectFieldOffset (смещение домена объекта) и другие методы.
С помощью этих методов мы можем получить указатель объекта. Смешая указатель, мы можем не только напрямую изменить данные, указанные указателем (даже если они являются частными), но мы даже можем найти объекты, которые JVM уже рассматривал мусор и может быть переработана.
4. Операция массива.
Эта часть включает в себя ArrayBaseOffset (получает адрес смещения первого элемента массива), ArrayIndexScale (получает адрес приращения элемента в массиве) и т. Д. Аррейсбазефсет используется в сочетании с ArrayIndexScale, и вы можете найти положение каждого элемента в массиве в памяти.
Поскольку максимальное значение массива Java является integer.max_value, метод распределения памяти небезопасного класса может использоваться для реализации супер больших массивов. Фактически, такие данные можно считать массивом C, поэтому вам необходимо обратить внимание на освобождение памяти в нужное время.
5. многопоточная синхронизация. Включая механизм блокировки, эксплуатацию CAS и т. Д.
Эта часть включает в себя Monitorenter, TryMonitorenter, Monitorexit, CompareandWapint, CompareandSwap и другие методы.
Среди них Monitorenter, TryMonitorenter и Monitorexit были помечены как устаревшие и не рекомендуются.
Работа CAS небезопасного класса может использоваться больше всего, и она предоставляет новое решение для механизма блокировки Java. Например, Atomicinteger и другие классы реализованы с помощью этого метода. Метод ComparandSwap является атомным, который может избежать тяжелых механизмов блокировки и повысить эффективность кода. Это оптимистичный замок, который обычно считается, что в большинстве случаев условия расы не существует, и если операция не удастся, она будет продолжать пытаться еще раз, пока не преуспеет.
6. Приостановить и восстановить.
Эта часть включает в себя парк, нераковые и другие методы.
Приостановите нить через метод парка. После звонка в парк нить будет блокироваться до тех пор, пока не произойдет тайм -аут или прерывание. Uncark может завершить ожидающую потоку, чтобы восстановить его в норму. Операция приостановки на резьбе во всей структуре параметральности инкапсулируется в классе LockSupport. В классе LockSupport существуют различные версии пакетных методов, но в конце концов, метод небезопасного. Park () вызывается.
7. Барьер памяти.
Эта часть включает в себя Loadfence, Storefence, Fullfence и другие методы. Это недавно введено в Java 8, чтобы определить барьеры памяти, чтобы избежать повторного заказа кода.
LoadFence () означает, что все операции нагрузки до завершения метода до барьера памяти. Аналогичным образом, Storefence () означает, что все операции хранилища до завершения этого метода до барьера памяти. Fullfence () означает, что все операции загрузки и хранилища до завершения метода до барьера памяти.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.