Kata pengantar
Artikel ini terutama memperkenalkan konten yang relevan tentang kelas yang tidak aman di Java. Ini dibagikan untuk referensi dan pembelajaran Anda. Saya tidak akan mengatakan banyak hal di bawah. Mari kita lihat perkenalan terperinci bersama -sama.
1. PENDAHULUAN KELAS YANG TIDAK
Kelas yang tidak aman ada di bawah paket Sun.misc dan bukan milik Java Standard. Namun, banyak perpustakaan kelas dasar Java, termasuk beberapa perpustakaan pengembangan kinerja tinggi yang banyak digunakan, dikembangkan berdasarkan kelas yang tidak aman, seperti Netty, Hadoop, Kafka, dll.
Tidak aman dapat digunakan untuk secara langsung mengakses sumber daya memori sistem dan mengelola secara mandiri. Kelas yang tidak aman memainkan peran besar dalam meningkatkan efisiensi operasi Java dan meningkatkan kemampuan operasi yang mendasari bahasa Java.
Tidak aman dapat dianggap sebagai pintu belakang yang tersisa di Java, menyediakan beberapa operasi tingkat rendah, seperti akses memori langsung, penjadwalan utas, dll.
Tidak aman tidak disarankan.
Berikut adalah beberapa contoh menggunakan tidak aman.
1.1 Instantiate Kelas Pribadi
impor java.lang.reflect.field; impor sun.misc.unsafe; kelas publik unsafeplayer {public static void main (string [] args) melempar pengecualian {// instantiate bidang yang tidak aman f = uncafe.class.getDeclaredfield ("theUnsafe"); f.setAccessible (true); Tidak aman tidak aman = (tidak aman) f.get (null); // Instantiate player player player = (player) uncafe.allocateInstance (player.class); player.setname ("Li Lei"); System.out.println (player.getName ()); }} class player {private string name; private player () {} public string getName () {return name; } public void setName (name string) {this.name = name; }} 1.2cas Operation, ubah nilai meter melalui modifikasi alamat offset memori
Gunakan CAS untuk memperbarui bagian atas tumpukan di TransferStack di Synchronousqueue dalam paket konkurensi Java.
/ MEKANICS UNCEFTPRIVIVAL STATIC SUN.MISC.UnSafe tidak aman; headoffset panjang final statis pribadi; static {try {unsafe = sun.misc.unsafe.getunsafe (); Kelas <?> K = transferstack.class; headoffset = uncafe.objectFieldOffset (k.getDeclaredfield ("head")); } catch (Exception e) {throw new error (e); }} // Volatile Snode head; // Perbarui bagian atas CASHEAD BOOLEAN (SNODE H, SNODE NH) {return h == head && unsafe.ComeeAndsWapObject (ini, headoffset, h, nh);} 1.3 Akses Memori Langsung
Akses memori langsung yang tidak aman: Ruang memori yang dibuka dengan tidak aman tidak menempati ruang tumpukan, dan tentu saja tidak memiliki fungsi pemulihan memori otomatis. Memungkinkan untuk menggunakan sumber daya memori sistem secara bebas seperti C.
2. Analisis Kode Sumber Kelas Tidak Aman
Sebagian besar API yang tidak aman adalah metode asli, terutama termasuk kategori berikut:
1) Kelas Terkait. Terutama menyediakan metode operasi kelas dan bidang statisnya.
2) Terkait Objek. Terutama menyediakan metode operasi objek dan bidangnya.
3) terkait arrray. Terutama menyediakan metode operasi array dan elemen di dalamnya.
4) Korelasi bersamaan. Ini terutama memberikan primitif sinkronisasi tingkat rendah, seperti CAS, penjadwalan utas, volatil, penghalang memori, dll.
5) Terkait Memori. Ini menyediakan metode akses memori langsung (melewati tumpukan Java dan secara langsung memanipulasi memori lokal), yang dapat dengan bebas memanfaatkan sumber daya memori sistem seperti C.
6) Sistem Terkait. Ini terutama mengembalikan beberapa informasi memori tingkat rendah, seperti ukuran alamat dan ukuran halaman memori.
2.1class terkait
// Offset atribut statis digunakan untuk membaca dan menulis atribut statis di kelas yang sesuai objek public public long staticfieldOffset (bidang f); Objek Asli Publik StaticFieldBase (Field F); // menilai apakah kelas perlu diinisialisasi public asli boolean harus diinisialisasi (kelas <?> C); // Pastikan bahwa kelas diinisialisasi dengan public void yang tidak dapat membuat kelas, class <?> loader, protectionDomain ProtectionDomain); // Tentukan kelas anonim yang dapat digunakan untuk secara dinamis membuat kelas kelas asli publik <?> DefineanonymousClass (kelas <?> HostClass, byte [] data, objek [] cppatches);
2.2 yang berhubungan dengan objek
Ada metode berikut untuk tipe dasar (boolean, byte, char, pendek, int, long, float, double) dan tipe referensi objek di java.
// Dapatkan Offset Lapangan dari Object Public Native Long ObjectFieldOffset (Field F); // Dapatkan nilai int dari alamat objek yang diberikan offset native int getint publik (objek o, offset panjang); // Atur nilai int dari alamat objek yang diberikan offset public native void putint (objek o, long offset, int x);
// Buat objek, tetapi konstruktornya tidak akan dipanggil. Jika kelas tidak diinisialisasi, kelas diinisialisasi. Objek asli public AlocedInstance (Class <?> CLS) melempar InstantiationException;
2.3 terkait array
/** * Laporkan offset elemen pertama dalam alokasi penyimpanan kelas array yang diberikan. Jika {@link #ArrayIndExscale} mengembalikan nilai bukan nol * untuk kelas yang sama, Anda dapat menggunakan faktor skala itu, bersama-sama dengan basis ini * offset, untuk membentuk offset baru untuk mengakses elemen array dari kelas * yang diberikan. * * @see #getInt(Object, long, int) *///Return the offset address of the first element in the array public native int arrayBaseOffset(Class<?> arrayClass);//boolean, byte, short, char, int, long, float, double, and object types have the following methods/** The value of {@code arrayBaseOffset(boolean[].class)} */public static final int Array_boolean_base_offset = theunsafe.arraybaseoffset (boolean []. Class); /** * Laporkan faktor skala untuk mengatasi elemen dalam alokasi penyimpanan * dari kelas array yang diberikan. Namun, array tipe "sempit" * umumnya tidak akan berfungsi dengan baik dengan aksesor seperti {@link * #getbyte (objek, int)}, sehingga faktor skala untuk kelas tersebut dilaporkan * sebagai nol. * * @see #ArrayBaseOffset * @see #getint (objek, panjang) * @see #putint (objek, panjang, int) * /// kembalikan ukuran yang ditempati oleh setiap elemen dalam array public in arrayIndexScale (class <?> ArrayClass); // boolean, byte, pendek, char, int, long, float, double, dan objek tipe memiliki metode berikut/** Nilai {@code arrayIndexScale (boolean []. Lokasi setiap elemen dalam array dalam memori dapat ditempatkan melalui ArrayBaseOffset dan ArrayIndexScale.
2.4 terkait konkurensi
2.4.1cas terkait
CAS: CompareandsWap, Offset Offset Memory Offset, Nilai yang Diharapkan Diharapkan, Nilai Baru X. Jika nilai variabel pada waktu saat ini dan nilai yang diharapkan sama, cobalah untuk memperbarui nilai variabel ke x. Kembalikan true jika pembaruan berhasil; Jika tidak, kembalikan salah.
// Perbarui nilai variabel ke x, jika nilai saat ini diharapkan // o: Object Offset: Offset Diharapkan: Nilai yang Diharapkan: Nilai Baru Publik Final Boolean CompareandsWapObject (Objek O, Long Offset, Objek Diharapkan, Objek X); Public Final Boolean CompareeAndsWapint (Object O, Long Offset, Int diharapkan, int x); Public Final Boolean CompareeAndswaplong (Object O, Long Offset, Long Diharapkan, Long X);
Dimulai dengan Java 8, metode berikut disediakan secara tidak aman:
// Tambahkan int getAndaddint publik (Object O, Long Offset, int delta) {int v; do {v = getIntVolatile (o, offset); } while (! compareEndsWapint (o, offset, v, v + delta)); return v;} public final long getandaddlong (objek o, long offset, long delta) {long v; do {v = getLongVolatile (o, offset); } while (! compareEndsWaplong (o, offset, v, v + delta)); return v;} // Setel int final int getAndSetInt (objek O, long offset, int newValue) {int v; do {v = getIntValatile (o, offset); } while (! compareeAndsWapint (o, offset, v, newValue)); return v;} public final long getAndSetLong (objek o, long offset, long newValue) {long v; do {v = getLongValatile (o, offset); } while (! compareEndsWaplong (o, offset, v, newValue)); return v;} objek akhir publik getAndSetObject (objek o, offset panjang, objek newValue) {objek v; do {v = getObjectValatile (o, offset); } while (! CompareEndsWapObject (o, offset, v, newValue)); mengembalikan v;2.4.2 Penjadwalan Thread Terkait
// Unlocking Thread Public Void Nak Unpark (Thread Object); // Memblokir Taman Void Asli Publik (Boolean Isabsolute, Long Time); // Dapatkan Objek Kunci Publik Monitor Public Void (Obyek O); // Rilis Object Lock Public Void Monitorexit (Object O);//Cobalah untuk mendapatkan Object Lock, Return True atau False Public Void Monitorexit (Object O);/Cobalah untuk mendapatkan Object Lock, Return True atau FALSE PUBLIC MONITOREXIT (Object o);
2.4.3 Bacaan dan penulisan terkait yang mudah menguap
Ada metode berikut untuk tipe dasar (boolean, byte, char, pendek, int, long, float, double) dan tipe referensi objek di java.
// Dapatkan referensi variabel dari offset yang ditentukan dari objek, dan gunakan semantik beban volatile // setara dengan versi volatile dari objek asli getObject (objek, panjang) getObjectVolatile (objek o, offset panjang); // penyimpanan referensi variabel ke offset yang ditentukan objek, dan gunakan semantik penyimpanan volatile // setara dengan versi volatile dari putobject (objek, panjang, objek) void public public putobjectVolatile (objek O, long offset, objek x);
/** * Versi {@link #putObjectVolatile (objek, panjang, objek)} * yang tidak menjamin visibilitas langsung toko ke * utas lainnya. Metode ini umumnya hanya berguna jika bidang * yang mendasarinya adalah java volatile (atau jika sel array, satu * yang sebaliknya hanya diakses menggunakan akses volatil). */public void putorderedObject (Object O, Long Offset, Object X); /** versi yang dipesan/malas dari {@link #putIntVolatile (objek, panjang, int)}*/public void public putorderedInt (objek o, long offset, int x); /** versi yang dipesan/malas dari {@link #putLongVolatile (objek, panjang, panjang)}*/public void public putorderedlong (objek o, long offset, long x);2.4.4 terkait penghalang memori
Java 8 diperkenalkan untuk mendefinisikan hambatan memori untuk menghindari pemesanan ulang kode.
// Hambatan Memori, melarang operasi muatan untuk dipesan ulang, yaitu operasi muatan sebelum penghalang tidak dapat dipesan ulang ke penghalang, operasi beban setelah penghalang tidak dapat dipesan kembali ke bagian depan penghalang bubur public public loadfence (); // memori public, melarang operasi toko sebelum penghalang, pelarangan operasi toko setelah publikasi, publikasi, public, public) proid; Operasi dari dirancang ulang ke depan penghalang public void fullfence ();
2.5 Akses memori langsung (memori non-heap)
Memori yang dialokasikan oleh alocatememory perlu bebas secara manual (tidak didaur ulang oleh GC)
// (boolean, byte, char, pendek, int, long, float, double) memiliki dua metode berikut: dapatkan dan put. // Dapatkan nilai int di alamat yang diberikan Publik asli int getint (alamat panjang); // Tetapkan nilai int di alamat yang diberikan public native void putint (alamat panjang, int x); // dapatkan pointer lokal public public long getAddress (alamat panjang); // penyimpanan pointer lokal ke alamat memori yang diberikan public void putaddress (alamat panjang, panjang x); // alokasikan memori public public asli allocatememory (long byte); // reallocate memori public public asli reallocatememory (alamat panjang, byte panjang); // inisialisasi konten memori public void setMemory public (objek o, long offset, long byte, value byte);//inisialisasi konten memori void public setMemory (non -null long, nilai byte);/ alamat, byte, nilai);} // menginisialisasi konten memori public void copymemory (objek srcbase, long srcoffset, objek destbase, destoffset panjang, byte panjang); // inisialisasi konten memori, copymemory (srcaddress, long destaddress, long bytes) {copycory (nol srcaddress, long destaddress, long bytes) {copycory srcaddress, long destaddress, long bytes) {copycory srcaddress, long destaddress, long bytes) {copycory srcaddress, long destaddress, long bytes) {copyCory bytes);} // melepaskan memori public void freememory (alamat panjang); 2.6 Terkait Sistem
// Kembalikan ukuran pointer. Nilai pengembalian adalah 4 atau 8. Public Int Alamat Publik (); /** Nilai {@code addressize ()}*/public static final int address_size = theunsafe.addresssize (); // Ukuran halaman memori. Public Native Int PageSize ();3. Bahan referensi
//www.vevb.com/article/140709.htm Mari Bicara Tentang Kelas Tidak Aman di Java
//www.vevb.com/article/140721.htm Java Magic Class: sun.misc.unsafe
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.