Dengan pengembangan Internet yang kuat, semakin banyak perusahaan internet menghadapi masalah keamanan bersamaan yang disebabkan oleh perluasan volume pengguna. Artikel ini berfokus pada beberapa mekanisme penguncian umum dalam konkurensi Java.
1. Kunci positif
Kunci Bias adalah mekanisme optimasi kunci yang diusulkan oleh JDK1.6. Gagasan intinya adalah bahwa jika program tidak bersaing, operasi sinkronisasi utas yang sebelumnya memperoleh kunci akan dibatalkan. Dengan kata lain, jika kunci diperoleh oleh utas, ia memasuki mode bias. Ketika utas meminta kunci lagi, tidak perlu melakukan operasi sinkronisasi yang relevan, sehingga menghemat waktu operasi. Jika utas lain membuat permintaan kunci di antaranya, kunci keluar mode bias. Menggunakan -xx:+UseBiasedlocking di JVM
Paket JVMProject; import java.util.list; impor java.util.vector; kelas publik bias {daftar statis publik <integer> numberList = vektor baru <Integer> (); public static void main (string [] args) {long begin = system.currentTimeMillis (); Int Count = 0; int startnum = 0; while (hitung <10000000) {numberList.Add (startNum); StartNum+= 2; Count ++; } long end = System.currentTimeMillis (); System.out.println (end-begin); }}Inisialisasi vektor, tambahkan 100.000.000 objek integer ke dalamnya, dan kemudian output perbedaan waktu. Ini digunakan untuk menguji kinerja kunci bias. Adapun mengapa Anda harus menggunakan vektor alih -alih arraylist?
Karena ArrayList adalah Thread-Insecure, Vector aman-utas. Ini mungkin tidak cukup spesifik, Anda dapat melihat kode sumber.
Hampir semua operasi di vektor di-sischronisasi, sedangkan arraylist tidak, jadi vektor aman-aman.
Selanjutnya, mari kita uji seberapa besar dampak pembukaan kunci bias dan tidak membuka kunci bias terhadap kinerja program.
Konfigurasikan parameter startup JVM (nyalakan bias lock) ke:
Konfigurasikan parameter startup JVM (tutup bias lock) ke:
Sempurna! Waktu berjalan dari program yang memungkinkan kunci bias secara signifikan lebih pendek. Ini memiliki keuntungan tertentu untuk memungkinkan kunci yang bias daripada tidak memungkinkan kunci yang bias. Metode sinkronisasi mengoperasikan objek dalam satu utas. Bahkan, itu juga dapat dipahami dengan cara ini. Ketika hanya ada satu utas yang mengoperasikan objek vektor dengan metode sinkronisasi, operasi pada vektor akan dikonversi menjadi operasi pada daftar array.
Kunci yang bias tidak memiliki efek optimasi yang kuat ketika kunci kompetitif, karena sejumlah besar kompetisi akan menyebabkan utas yang menahan kunci untuk beralih terus menerus, dan sulit bagi kunci untuk tetap dalam mode bias. Pada saat ini, menggunakan kunci bias tidak hanya tidak mencapai optimasi kinerja, tetapi dapat mengurangi kinerja sistem. Oleh karena itu, dalam kasus persaingan sengit, Anda dapat mencoba menggunakannya.
-Xx: -suseBiastedlocking parameter menonaktifkan penguncian bias.
2. Kunci ringan
Jika kunci yang bias gagal, mesin virtual Java akan meminta utas untuk mengajukan kunci yang ringan. Kunci ringan diimplementasikan di dalam mesin virtual dan diimplementasikan menggunakan objek yang menjadi BasicObjectLock, yang terdiri dari objek BasicLock dan penunjuk objek Java yang memegang kunci. Objek BasicObjectLock ditempatkan di java stack frame. Bidang yang ditampilkan_header juga dipertahankan di dalam objek BasicLock, yang digunakan untuk mendukung kata tanda header objek.
Saat utas memegang kunci objek, informasi tanda header objek adalah sebagai berikut
[ptr | 00] terkunci
Dua bit di akhir adalah 00, dan seluruh kata tanda adalah pointer ke objek BasicLock. Karena objek BasicObjectLock ada di tumpukan utas, pointer harus menunjuk ke ruang tumpukan utas yang menahan kunci. Ketika perlu untuk menentukan apakah utas memegang objek, hanya perlu untuk hanya menentukan apakah pointer header objek berada dalam kisaran alamat tumpukan utas saat ini. Pada saat yang sama, yang ditampilkan_Header dari objek BasicLock mencadangkan konten kata tanda dari objek asli, dan bidang OBJ dari objek BasicObjectLock menunjuk ke kepala objek yang memegang kunci.
3. Kunci kelas berat
Ketika kunci ringan gagal, mesin virtual akan menggunakan kunci kelas berat. Saat menggunakan kunci kelas berat, kata tanda objek adalah sebagai berikut:
[PTR | 10] Monitor
Selama operasi, utas dapat ditangguhkan di tingkat sistem operasi. Jika demikian, biaya pengalihan dan panggilan antar utas akan sangat meningkat.
4. Kunci putaran
Kunci putaran dapat membuat benang tidak ditangguhkan ketika belum mendapatkan kunci, tetapi malah beralih untuk menjalankan loop kosong (yaitu, putaran yang disebut, yang berarti mengeksekusi loop kosong itu sendiri). Jika utas dapat memperoleh kunci setelah beberapa loop kosong, itu akan terus mengeksekusi. Jika utas masih tidak dapat memperoleh kunci, itu akan ditangguhkan.
Setelah menggunakan Spin Lock, kemungkinan benang ditangguhkan relatif berkurang, dan konsistensi eksekusi utas relatif ditingkatkan. Oleh karena itu, ia memiliki signifikansi positif tertentu untuk utas bersamaan yang tidak terlalu kompetitif dengan kunci dan memiliki waktu yang sangat singkat. Namun, untuk program bersamaan yang sangat kompetitif dengan kunci dan kunci utuh tunggal menempati waktu yang lama, kunci putaran sering kali secara tegas tidak dapat memperoleh kunci yang sesuai setelah putaran menunggu. Ini tidak hanya membuang -buang waktu CPU, tetapi juga tidak dapat dihindari memiliki operasi yang ditangguhkan pada akhirnya, tetapi juga membuang -buang sumber daya sistem.
Di JDK1.6, mesin virtual Java menyediakan parameter -xx:+usespinning untuk mengaktifkan kunci spin, dan menggunakan parameter -xx: preblockspin untuk mengatur berapa kali kunci spin menunggu.
Mulai dari JDK 1.7, parameter kunci spin dibatalkan. Mesin virtual tidak lagi mendukung kunci spin yang dikonfigurasi pengguna. Kunci spin akan selalu dieksekusi, dan jumlah kunci putaran secara otomatis disesuaikan oleh mesin virtual.