Apakah kunci yang disegerakkan? Kunci sebenarnya adalah objek, mana-mana satu boleh digunakan Semua objek dalam Java adalah kunci Dalam erti kata lain, semua objek dalam Java boleh menjadi kunci.
Kali ini terutamanya kita bercakap tentang rutin naik taraf kunci yang disegerakkan
synchronized
Ia akan melalui empat peringkat: Keadaan bebas kunci, kunci berat sebelah, kunci ringan, kunci berat Daripada menggunakan sumber yang paling sedikit dan mempunyai prestasi tertinggi kepada menggunakan banyak sumber dan mempunyai prestasi yang paling teruk.
Mari kita lihat dahulu mengapa kunci keadaan ini dipanggil kunci dan apakah prinsip pengecualian bersama mereka.
Apabila benang mencapai blok kod segerak dan cuba mendapatkan objek kunci, ia akan menyemak ID benang dalam MarkWord
dalam objek header. Jika Jika tiada ID di sini, simpan sendiri dan dapatkan kuncinya. Jika ada, semak sama ada ia adalah urutan semasa. Jika tidak, CAS akan cuba menukarnya. Jika ya, sumber kunci telah diperolehi.
Berikut ialah penerangan terperinci tentang logik yang CAS cuba ubah suai: ia akan menyemak status utas yang memegang kunci berat sebelah. Mula-mula merentasi semua utas JVM semasa Jika dapat mencari utas berat sebelah, ini bermakna benang berat sebelah masih hidup . ia akan menyemak Sama ada utas sedang melaksanakan kod dalam blok kod disegerakkan , jika ya, ia dinaik taraf kepada kunci ringan dan terus bersaing untuk kunci CAS. Oleh itu, selepas menambah kunci berat sebelah, hanya satu utas boleh mendapatkan kunci dan melaksanakan kod dalam blok kod disegerakkan pada masa yang sama.
Periksa sama ada penuding MarkWord
dalam Lock Record
dalam pengepala objek menghala ke tindanan mesin maya benang semasa. Jika ya, ambil kunci dan laksanakan perniagaan. Jika tidak, lakukan CAS dan cuba ubah suainya Jika pengubahsuaian gagal beberapa kali, tingkatkan kepada kunci kelas berat.
Semak MarkWord
yang ditunjuk dalam ObjectMonitor
dalam pengepala objek untuk melihat sama ada pemiliknya ialah benang semasa Jika tidak, buang ke ObjectMonitor >Beratur dalam baris gilir dan gantung benang, menunggu untuk dikejutkan. EntryList
objek baharu buat sementara waktu tanpa kunci . Oleh kerana kunci berat sebelah ditangguhkan secara lalai, tiada kunci berat sebelah dalam 4 saat pertama memulakan JVM Walau bagaimanapun, jika tetapan kelewatan kunci berat sebelah dimatikan, kunci berat sebelah tanpa nama akan ditambahkan pada objek baharu. Maksudnya, objek ini ingin mencari benang untuk menambah kunci bias, tetapi tidak dapat menemuinya, yang dipanggil bias tanpa nama. ID benang yang disimpan ialah sekumpulan 0000s dan tiada maklumat alamat sama sekali.
Kita boleh mematikan kelewatan kunci berat sebelah melalui konfigurasi berikut.//关闭偏向锁延迟的指令 -XX:BiasedLockingStartuoDelay=0
mendapatkan sumber kunci ini, ia akan berjaya diperoleh pada masa ini dan ia akan menjadi kunci berat sebelah , kunci berat sebelah menyimpan ID benang.
Apabilapeningkatan kunci berat sebelah, pembatalan kunci berat sebelah akan dicetuskan pembatalan kunci berat sebelah perlu menunggu sehingga titik selamat, seperti GC. . Kos pembatalan kunci berat sebelah adalah terlalu tinggi, jadi secara lalai, kelewatan kunci berat sebelah akan dilakukan pada permulaan. Jika terdapat berbilang benang bersaing secara langsung, kunci pincang akan dilangkau dan terus menjadi kunci ringan.
Mari kita bincangkan tentang proses pembatalan kunci berat sebelah secara terperinci Mengapa kosnya tinggi? Apabila benang mendapat kunci berat sebelah, ia akan menghalakan id utas dalam dalam pengepala objek kunci kepada dirinya sendiri Apabila utas lain datang untuk bersaing untuk kunci dan kunci dinaik taraf, ia akan mengambil Mark Work
sebelum. menggantungnya. Pergi ke utas yang memilih kunci , kemudian kosongkan id utas dalam Mark Work , tambah kunci ringan dan kemudian sambung semula utas yang digantung. untuk meneruskan pelaksanaan . Inilah sebabnya anda menunggu sehingga titik selamat sebelum melakukan peningkatan kunci, kerana urutan dijeda.
kunci ringan Kesan kunci ringan adalah berdasarkan CAS cuba memperoleh sumber kunci dan kunci putaran suai akan digunakan di sini Bilangan putaran kali ini ditentukan berdasarkan kejayaan atau kegagalan CAS terakhir dan masa yang dibelanjakan.
Kunci ringan sesuai untuk senario di manapersaingan tidak begitu sengit Satu utas mendapat kunci, melaksanakan blok kod penyegerakan dan proses selesai dengan cepat. Benang lain mencuba sekali atau dua kali untuk mendapatkan kunci, dan kemudian melaksanakannya, yang tidak akan membuat benang menunggu lama.
Kunci heavyweightJika ia mencapai kunci heavyweight, tiada apa yang perlu diperkatakan Jika seutas benang memegang kunci, yang lainmereka yang ingin mengambil kunci akan menutup telefon dan menunggu. untuk kunci Selepas dilepaskan, mereka dikejutkan dalam urutan.
Pengasar kunci & penghapusan kunciPengasar kunci/pengembangan kunciPeluasan kunci ialah pengoptimuman yang JIT lakukan untuk kami semasa menyusun fail Java, ia akan mengurangkan kunci Bilangan pemerolehan dan pelepasan. Contohnya:while(){ synchronized(){ // 多次的获取和释放,成本太高,会被优化为下面这种 } } synchronized(){ while(){ // 拿到锁后执行循环,只加锁和释放一次 } }
锁消除则是在一个加锁的同步代码块中,没有任何共享资源,也不存在锁竞争的情况,JIT编译时,就直接将锁的指令优化掉。 比如
synchronized(){ int a = 1; a++; //操作局部变量的逻辑 }
Atas ialah kandungan terperinci Apakah proses naik taraf kunci disegerakkan di Jawa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!