Предисловие
Эта статья в основном представляет соответствующий контент о небезопасном классе в Java. Это обменивается вашей ссылкой и обучением. Я не скажу многое ниже. Давайте посмотрим на подробное введение вместе.
1. Небезопасное введение в класс
Небезопасный класс находится под пакетом Sun.misc и не принадлежит стандарту Java. Тем не менее, многие классовые библиотеки Java, в том числе некоторые широко используемые библиотеки развития высокопроизводительного развития, разработаны на основе небезопасного класса, таких как Netty, Hadoop, Kafka и т. Д.
Небезопасно может использоваться для непосредственного доступа к ресурсам системной памяти и самостоятельно управлять. Небезопасный класс играет отличную роль в повышении эффективности работы Java и повышении основных возможностей работы языка Java.
Небезопасно можно считать задним ходом, оставленным в Java, обеспечивая некоторые низкоуровневые операции, такие как прямой доступ к памяти, планирование потоков и т. Д.
Небезопасно не рекомендуется.
Вот несколько примеров использования небезопасного.
1.1 создать частное занятие
импортировать java.lang.reflect.field; Импорт sun.misc.unsafe; открытый класс Unfopplayer {public static void main (string [] args) выбрасывает исключение {// создание небезопасного поля f = uncafe.class.getDeclaredfield ("theunsafe"); f.setAccessible (true); Небезопасно небезопасно = (небезопасно) f.get (null); // создание игрока игрока игрока = (игрок) unfea.lalocateinstance (player.class); player.setname ("li lei"); System.out.println (player.getName ()); }} класс Player {private String name; private Player () {} public String getName () {return name; } public void setName (string name) {this.name = name; }} 1.2CAS работы, измените значение измерителя через изменение адреса смещения памяти
Используйте CAS, чтобы обновить верхнюю часть стека в TransFerstack In SynchronousQueue в пакете параллелизма Java.
/ Небезопасная механика, предпринимайте статическое окончательное sun.misc.unsafe небезопасно; частный статический последний длинный голов; static {try {небезопасно = sun.misc.unsafe.getunsafe (); Класс <?> K = transferstack.class; Headoffset = uncefe.objectfieldoffset (k.getdeclaredfield ("head")); } catch (Exception e) {бросить новую ошибку (e); }} // volatile Snode Head; // Обновление верхней части стека Boolean Cashead (Snode H, Snode nh) {return h == Head && uncafe.compareAndswapobject (это, Headoffset, h, nh);} 1.3 Прямой доступ к памяти
Прямой доступ к памяти Unfe Сделайте возможным использовать ресурсы системной памяти свободно, как C.
2. Небезопасной анализ исходного кода класса
Большинство API -интерфейсов небезопасны являются местными методами, в основном включая следующие категории:
1) Связанный с классом. В основном предоставляет методы работы класса и его статических полей.
2) Связанный с объектом. В основном предоставляет методы работы объекта и его поля.
3) Арррей связан. В основном предоставляет в них методы работы массивов и элементов.
4) Одновременная корреляция. В основном он обеспечивает низкоуровневые примитивы синхронизации, такие как CAS, планирование потоков, летучие, барьера памяти и т. Д.
5) Связанная с памятью. Он предоставляет метод прямого доступа к памяти (обход кучи Java и непосредственно манипулируя локальной памятью), который может свободно использовать ресурсы системной памяти, такие как C.
6) Связанный с системой. В основном он возвращает некоторую информацию о памяти низкого уровня, такую как размер адреса и размер страницы памяти.
2,1 класса связаны
// смещение статических атрибутов используется для чтения и написания статических атрибутов в соответствующем объекте класса Public Long Staticfieldoffset (поле F); Общедоступный нативный объект StaticfieldBase (Field F); // Судить, должен ли класс инициализированным общедоступным нативным логическим булевым Loader, ProtectDomain ProtectDomain); // Определить анонимный класс, который можно использовать для динамического создания классов общественного нативного класса <?> DefineanonymousClass (класс <?> hostclass, byte [] data, object [] cppatches);
2,2Bject
Существуют следующие методы для основных типов (логический, байт, чар, короткий, Int, Long, Float, Double) и ссылки на объекты в Java.
// Получите смещение поля общедоступного нативного LongfieldOffset (поле F); // Получение значения int заданного объекта смещение публичного нативного int getInt (Object O, LOG OFFSET); // Установите значение int заданного объекта смещение адреса общедоступной void putint (Object O, Long Offset, int x);
// Создать объект, но его конструктор не будет вызван. Если класс не инициализирован, класс инициализируется. Общественный родной объект AllocateInstance (Class <?> CLS) бросает InstantiationException;
2.3 Связанный с массивом
/** * Сообщите о смещении первого элемента в распределении хранилища A * данного класса массива. Если {@link #arrayindexscale} возвращает ненулевое значение * для одного и того же класса, вы можете использовать этот масштабный коэффициент вместе с этим * базовым смещением, чтобы сформировать новые смещения для доступа к элементам массивов * данного класса. * * @see #getint (Object, long, int) * /// возвращает адрес смещения первого элемента в общедоступном нативном int arraybaseoffset (класс <?> Arrayclass); // Boolean, Byte, Short, char, Long, Float, Double и Object Types имеют следующие методы. Array_boolean_base_offset = theunsafe.arraybaseoffset (boolean []. Class); /** * Сообщите о масштабном коэффициенте для решения элементов в хранилище * распределение данного класса массива. Тем не менее, массивы «узких» типов *, как правило, не будут работать должным образом с такими аксессуами, как {@link * #getbyte (Object, int)}, поэтому масштабный коэффициент для таких классов сообщается * как нулевой. * * @see #arraybaseoffset * @see #getint (Object, long) * @see #putint (Object, long, int) * /// возвращает размер, занятый каждым элементом в общедоступном int arrayindexscale (класс <?> Arrayclass); // Boolean, Byte, Short, Char, Int, Long, Float, Double и Tipes имеют следующие методы/** Значение {@code arrayindexscale (boolean []. Class)}*/public Static final int array_boolean_index_scale = theunsafe.arrayindexscale (boolean [].. Class); Расположение каждого элемента в массиве в памяти может быть расположено через Arraybaseoffset и Arrayindexscale.
2.4 Связанная с параллелизмом
2.4.1cas связаны
CAS: ComparandsWap, смещение адреса смещения памяти, ожидаемое значение, ожидаемое значение, новое значение x. Если значение переменной в текущее время и ожидаемое значение равно, попробуйте обновить значение переменной до x. Вернуть True, если обновление успешно; В противном случае вернуть ложь.
// Обновление значения переменной до x, если ожидается текущее значение // o: Object Offset: смещение ожидаемое: ожидаемое значение x: новое значение публичное окончательное окончательное логическое больное. Общественный финальный логический логический баланс (объект O, Long Offset, int ожидается, int x); Общественный финальный коренной логический BOOLEANDANDSWAPLONG (Object O, долгое смещение, долгожданное, длинное х);
Начиная с Java 8, небезопасны следующие методы:
// Добавить Public int int getAndadint (Object O, Long Offset, int delta) {int v; do {v = getIntvolatile (o, offset); } while (! CompareAndsWapint (O, Offset, V, V + Delta)); return v;} public final long getandAddlong (объект o, long offset, long delta) {long v; do {v = getlongvolatile (o, offset); } while (! CompareAndsWaplong (O, Offset, V, V + Delta)); return v;} // Установить публичный окончательный int getAndsetint (Object O, Long Offset, int newValue) {int v; do {v = GetIntValatile (O, Offset); } while (! CompareandSwapint (O, Offset, V, NewValue)); return v;} public final long getAndsetlong (объект o, long offset, long newvalue) {long v; do {v = getLongValatile (o, offset); } while (! CompareAndsWaplong (O, Offset, V, NewValue)); return v;} public final Object getAndSetObject (Object O, Long Offset, Object newValue) {Object V; do {v = getObjectValatile (o, offset); } while (! CompareAndsWobobject (O, Offset, V, NewValue)); возврат V;2.4.2 Связано спланировано.
//Unblocking thread public native void unpark(Object thread);//Blocking thread public native void park(boolean isAbsolute, long time);//Get object lock public native void monitorEnter(Object o);//Release object lock public native void monitorExit(Object o);//Try to obtain object lock, return true or false to indicate whether it is successful public native boolean tryMonitorEnter(Object o);
2.4.3.
Существуют следующие методы для основных типов (логический, байт, чар, короткий, Int, Long, Float, Double) и ссылки на объекты в Java.
// Получите ссылку на переменную из указанного смещения объекта и используйте семантику нагрузки летучих // эквивалентно изменчивой версии getObject (объект, LONG) общедоступного нативного объекта GetObjectVolatile (объект O, длинное смещение); // Хранение Справочник переменной на указанное смещение объекта и используйте семантику хранения летучих // эквивалентно изменчивой версии putObject (объект, длинное, объект) общедоступной пустой путопроводной (объект o, длинное смещение, объект x);
/** * Версия {@link #putObjectVolatile (Object, Long, Object)} *, которая не гарантирует немедленную видимость хранилища для * других потоков. Этот метод, как правило, полезен только в том случае, если * базовое поле является летучим Java (или если массивная ячейка, один *, который в противном случае доступен только с помощью летучих доступа). */public vino void putorderedObject (объект O, длинное смещение, объект x); /** Заказано/ленивая версия {@link #putintvolatile (Object, long, int)}*/public void void putorderedint (объект o, long смещение, int x); /** упорядочен/ленивая версия {@link #putlongvolatile (объект, длинный, длинный)}*/public void void putorderledlong (объект o, длинное смещение, длинный х);2.4.4 Связано с барьером памяти
Java 8 была введена для определения барьеров памяти, чтобы избежать переупорядочения кода.
// Барьер памяти, запрещает переупорядоченные операции нагрузки, то есть операции нагрузки до того, как барьер не может быть переупорядочен на барьер, операции нагрузки после того, как барьер не может быть переупорядочен в переднюю часть барьерного общего нативного нагрузки (); // Общедоступные нагрузки памяти, запрещают операции хранилища до барьеры, запрещают закуски, инициируемые, и) Операции от переупорядочивания до передней части барьерной общественной родной пустоты ();
2.5 Прямой доступ к памяти (память без HEAP)
Память, выделенная Allocatememory, должна быть свободна вручную (не переработана GC)
// (логический, байт, чар, короткий, int, long, float, Double) имеют следующие два метода: получить и положить. // Получите значение int на данном адресе Public intain int getInt (длинный адрес); // Установите значение int на данном адресу public void putint putint (Long Address, int x); // Получить местный нативный нативный getAddress (длинный адрес); // хранилище локальный указатель к данному адресу памяти общедоступный родной void putaddress (длинный адрес, длинный X); // выделять общедоступную память общедоступной нативной длинной аллокатемории (длинные байты); // перераспределять общедоступную нативную нативную давню address, bytes, value);}//Initialize the memory content public native void copyMemory(Object srcBase, long srcOffset, Object destBase, long destOffset, long bytes);//Initialize the memory content public void copyMemory(long srcAddress, long destAddress, long bytes) { copyMemory(null, srcAddress, null, destAddress, байты);} // выпустить общедоступную нативную void void freememory (длинный адрес); 2.6 Связанная с система
// вернуть размер указателя. Возвращаемое значение составляет 4 или 8. Public Native int AddchSize (); /** Значение {@code AddicsSize ()}*/public static final int address_size = theunsafe.addresssize (); // размер страницы памяти. общественный родной int pageSize ();3. Справочные материалы
//www.vevb.com/article/140709.htm Давайте поговорим о небезопасном классе в Java
//www.vevb.com/article/140721.htm Java Magic Class: sun.misc.unsafe
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.