Apa kelas yang tidak aman?
Java awalnya dirancang sebagai lingkungan yang dikendalikan dengan aman. Meskipun demikian, Java Hotspot masih mencakup "backdoor" yang menyediakan beberapa operasi tingkat rendah yang dapat secara langsung memanipulasi memori dan benang. Kelas backdoor ini - sun.misc.unsafe - banyak digunakan dalam paketnya sendiri oleh JDK, seperti java.nio dan java.util.concurrent. Namun, pintu belakang ini tidak direkomendasikan di lingkungan produksi sama sekali. Karena API ini sangat tidak aman, tidak ringan, dan tidak stabil. Kelas tidak aman ini memberikan pandangan tentang struktur internal JVM hotspot dan dapat dimodifikasi. Kadang -kadang dapat digunakan untuk mempelajari struktur internal mesin virtual tanpa debugging C ++, dan kadang -kadang dapat digunakan sebagai pemantauan kinerja dan alat pengembangan.
perkenalan
Baru -baru ini, saya melihat kode sumber paket bersamaan Java dan menemukan kelas magis yang tidak aman. Saya mempelajarinya dengan cermat dan membaginya di sini.
Kelas yang tidak aman ada di bawah paket Sun.misc dan bukan milik Java Standard. Namun, banyak perpustakaan kelas Java dasar, termasuk beberapa perpustakaan pengembangan kinerja tinggi yang banyak digunakan, dikembangkan berdasarkan kelas yang tidak aman, seperti Netty, Cassandra, Hadoop, Kafka, dll. Kelas yang tidak aman memainkan peran besar dalam meningkatkan efisiensi operasi Java dan meningkatkan kemampuan operasi yang mendasari bahasa Java.
Kelas yang tidak aman memberi Java kemampuan untuk mengoperasikan ruang memori seperti pointer dalam bahasa C, dan juga membawa masalah pointer. Penggunaan kelas yang tidak aman akan meningkatkan kemungkinan kesalahan, jadi Java tidak merekomendasikannya untuk digunakan, dan hampir tidak ada dokumentasi resmi. Oracle berencana untuk menghapus kelas yang tidak aman dari Java 9, dan jika itu masalahnya, itu akan terlalu besar.
Biasanya yang terbaik adalah tidak menggunakan kelas yang tidak aman kecuali ia memiliki tujuan yang jelas dan juga memiliki pemahaman mendalam tentang hal itu. Untuk menggunakan kelas yang tidak aman, Anda perlu menggunakan beberapa metode rumit. Kelas yang tidak aman menggunakan pola singleton dan perlu diperoleh melalui metode statis getunsafe (). Namun, kelas yang tidak aman telah membatasi itu. Jika itu adalah panggilan normal, itu akan melempar pengecualian Exception keamanan; Hanya kelas yang dimuat oleh loader kelas utama yang dapat memanggil metode ini. Kode sumber adalah sebagai berikut:
public static tidak aman getUnsafe () {class var0 = reflection.getCallerClass (); if (! vm.issystemdomainloader (var0.getClassLoader ())) {throw new SecurityException ("Uncafe"); } else {return theunsafe; }}Ada juga beberapa cara untuk memuat kode pengguna menggunakan loader kelas utama, seperti mengatur parameter BootClassPath. Tetapi cara yang lebih sederhana adalah dengan menggunakan refleksi java, sebagai berikut:
Bidang f = uncafe.class.getDeclaredfield ("theunsafe"); f.setAccessible (true); Tidak aman tidak aman = (tidak aman) f.get (null);Setelah mendapatkan contoh yang tidak aman, kita dapat melakukan apa pun yang kita inginkan. Kelas yang tidak aman menyediakan fungsi -fungsi berikut:
1. Manajemen memori. Termasuk memori mengalokasikan, membebaskan memori, dll.
Bagian ini mencakup allocatememory (allocatememory), reallocatememory (reallocatememory), copymemory (copy memori), freememory (memori bebas), getAddress (getGet memori), alamat, page, get the integer pointed to the memory address), getintvolatile (get get the the integer menunjuk ke oleh alamat memori), getintvolatile (getin (get the integer menunjuk ke oleh alamat memori), getintvolatile (getin (get the integer menunjuk ke oleh alamat memori), getintvolatile (getin (get the integer menunjuk ke oleh alamat memori), getintvolatile (getin (get the integer menunjuk ke oleh alamat memori), getintvolatile (getTed point TO integer menunjuk ke oleh alamat memori), getintvolatile semantik), putint (tulis bilangan bulat ke alamat memori yang ditentukan), putintvolatile (tulis bilangan bulat ke alamat memori yang ditentukan dan mendukung semantik volatil), putorderedInt (tulis bilangan bulat ke alamat memori yang ditentukan, metode yang dipesan atau tertunda). getxxx dan putxxx berisi berbagai jenis operasi dasar.
Menggunakan metode Copymemory, kami dapat mengimplementasikan metode salin objek umum tanpa mengimplementasikan metode klon untuk setiap objek. Tentu saja, metode umum ini hanya dapat mencapai penyalinan objek yang dangkal.
2. Instantiasi objek yang tidak konvensional.
Metode allocateInstance () menyediakan cara lain untuk membuat instance. Biasanya kita dapat membuat objek dengan baru atau refleksi. Gunakan metode allocateInstance () untuk secara langsung menghasilkan instance objek tanpa memanggil konstruktor dan metode inisialisasi lainnya.
Ini berguna ketika deserialized objek, memungkinkan untuk membangun kembali dan menetapkan bidang akhir tanpa memanggil konstruktor.
3. Kelas Operasi, Objek, dan Variabel.
Bagian ini termasuk StaticFieldOffset (statis domain offset), Defineclass (kelas definisi), DefineanonymousClass (Definition Anonymous Class), EnsureClassinitialized (Pastikan Inisialisasi Kelas), ObjectFieldOffset (Object Domain Offset) dan metode lainnya.
Melalui metode ini, kita bisa mendapatkan penunjuk objek. Dengan mengimbangi pointer, kita tidak hanya dapat secara langsung memodifikasi data yang ditunjukkan oleh pointer (bahkan jika mereka pribadi), tetapi kita bahkan dapat menemukan objek yang JVM telah mempertimbangkan sampah dan dapat didaur ulang.
4. Operasi array.
Bagian ini termasuk ArrayBaseOffset (mendapatkan alamat offset dari elemen pertama dari array), ArrayIndexScale (mendapatkan alamat tambahan elemen dalam array), dll. ArrayBaseOffset digunakan bersama dengan ArrayIndexScale, dan Anda dapat menemukan posisi setiap elemen dalam array dalam memori.
Karena nilai array maksimum Java adalah integer.max_value, metode alokasi memori dari kelas yang tidak aman dapat digunakan untuk mengimplementasikan array super besar. Faktanya, data tersebut dapat dianggap sebagai array C, jadi Anda perlu memperhatikan memori membebaskan pada waktu yang tepat.
5. Sinkronisasi multi-thread. Termasuk mekanisme penguncian, operasi CAS, dll.
Bagian ini termasuk Monitorenter, TryMonitorenter, Monitorexit, CompareEndsWapint, CompareEndsWap, dan metode lainnya.
Di antara mereka, Monitorenter, TryMonitorenter, dan Monitorexit telah ditandai sebagai sudah usang dan tidak direkomendasikan.
Operasi CAS dari kelas yang tidak aman dapat digunakan paling banyak, dan memberikan solusi baru untuk mekanisme kunci Java. Misalnya, AtomicInteger dan kelas lainnya semuanya diimplementasikan melalui metode ini. Metode compareandswap adalah atom, yang dapat menghindari mekanisme penguncian yang berat dan meningkatkan efisiensi kode. Ini adalah kunci yang optimis, yang biasanya diyakini bahwa dalam kebanyakan kasus tidak ada kondisi ras, dan jika operasi gagal, itu akan terus mencoba lagi sampai berhasil.
6. Tangguhkan dan Pulihkan.
Bagian ini termasuk taman, unpark, dan metode lainnya.
Tangguhkan utas melalui metode taman. Setelah menelepon taman, utas akan diblokir sampai batas waktu atau interupsi terjadi. Unpark dapat menghentikan utas yang tertunda untuk mengembalikannya menjadi normal. Operasi penangguhan pada utas di seluruh kerangka kerja konkurensi dienkapsulasi di kelas Locksupport. Ada berbagai versi metode paket di kelas Locksupport, tetapi pada akhirnya, metode tidak aman. Park () dipanggil.
7. Penghalang Memori.
Bagian ini termasuk LoadFence, Storefence, Fullfence dan Metode Lainnya. Ini baru diperkenalkan di Java 8 untuk mendefinisikan hambatan memori untuk menghindari pemesanan ulang kode.
LoadFence () berarti bahwa semua operasi beban sebelum metode diselesaikan sebelum penghalang memori. Demikian pula, Storefence () berarti bahwa semua operasi toko sebelum metode ini diselesaikan sebelum penghalang memori. FullFence () berarti semua operasi beban dan penyimpanan sebelum metode diselesaikan sebelum penghalang memori.
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.