Rumah  >  Artikel  >  Java  >  Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

WBOY
WBOYke hadapan
2022-06-22 12:14:281498semak imbas

Artikel ini membawa anda pengetahuan yang berkaitan tentang java, yang terutamanya mengatur isu yang berkaitan dengan pengaturcaraan serentak, termasuk model memori Java, penjelasan terperinci tentang tidak menentu dan prinsip pelaksanaan disegerakkan, dsb. Mari kita lihat bersama-sama, saya harap ia akan membantu semua orang.

Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

Pembelajaran yang disyorkan: "tutorial video java"

1. Asas JMM - prinsip komputer

Memori Java Modelnya ialah Java Memory Model, atau singkatannya JMM. JMM mentakrifkan cara Mesin Maya Java (JVM) berfungsi dalam memori komputer (RAM). JVM ialah keseluruhan model maya komputer, jadi JMM bergabung dengan JVM. Versi Java1.5 telah memfaktorkannya semula, dan Java semasa masih menggunakan versi Java1.5. Masalah yang dihadapi oleh Jmm adalah sama seperti yang dihadapi dalam komputer moden.
Masalah concurrency dalam komputer fizikal Masalah concurrency yang dihadapi oleh mesin fizikal mempunyai banyak persamaan dengan situasi dalam mesin maya Skim pengendalian concurrency mesin fizikal juga mempunyai kepentingan rujukan yang besar untuk pelaksanaan mesin maya.
Menurut "Laporan Jeff Dean di Google All-Engineering Conference" kita dapat melihat bahawa

Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

Apabila komputer melakukan beberapa operasi asas biasa kita, masa tindak balas diperlukan adalah Tidak sama.

Kes berikut adalah untuk ilustrasi sahaja dan tidak mewakili situasi sebenar.

Jika 1M data int dibaca daripada memori dan terkumpul oleh CPU, berapa lama masa yang diperlukan?
Lakukan pengiraan mudah untuk data 1M, jenis int dalam Java ialah 32 bit dan 4 bait Terdapat sejumlah 1024*1024/4 = 262144 integer ialah: 262144 0.6 = 157286 Nanosaat, dan kami tahu bahawa ia mengambil masa 250,000 nanosaat untuk membaca data 1M dari memori Walaupun terdapat jurang antara keduanya (sudah tentu, jurangnya tidak kecil, seratus ribu nanosaat adalah masa yang cukup untuk CPU melaksanakan hampir dua. ratus ribu arahan), tetapi ia masih dalam susunan magnitud. Walau bagaimanapun, tanpa sebarang mekanisme caching, ini bermakna setiap nombor perlu dibaca dari memori Selain itu, ia mengambil masa 100 nanosaat untuk CPU membaca memori sekali masa pengiraan mengambil masa 262144100 250000 = 26 464 400 nanosaat, iaitu perbezaan dalam susunan magnitud.

Dan pada hakikatnya, kebanyakan tugas pengkomputeran tidak dapat diselesaikan dengan hanya "pengkomputeran" oleh pemproses Pemproses mesti sekurang-kurangnya berinteraksi dengan memori, seperti membaca data pengkomputeran, menyimpan hasil pengkomputeran, dsb. I/ ini. Operasi O pada dasarnya mustahil untuk dihapuskan (tidak boleh bergantung pada daftar sahaja untuk menyelesaikan semua tugas pengkomputeran). Kelajuan CPU dan memori dalam komputer awal adalah hampir sama, tetapi dalam komputer moden, kelajuan arahan CPU jauh melebihi kelajuan akses memori Memandangkan terdapat jurang beberapa pesanan magnitud antara peranti storan komputer dan kelajuan pengkomputeran pemproses, komputer moden Sistem komputer perlu menambah lapisan cache (Cache) dengan kelajuan baca dan tulis sedekat mungkin dengan kelajuan operasi pemproses sebagai penampan antara memori dan pemproses: data yang diperlukan untuk operasi disalin ke cache supaya operasi boleh Teruskan dengan cepat, dan apabila operasi selesai, ia disegerakkan kembali ke memori daripada cache, supaya pemproses tidak perlu menunggu memori membaca dan menulis perlahan.

Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

Dalam sistem komputer, daftar ialah cache tahap L0, diikuti oleh L1, L2, L3 (diikuti memori, setempat cakera, storan jauh). Ruang storan cache yang lebih jauh ke atas adalah lebih kecil, kelajuan lebih cepat, dan kos lebih tinggi ruang storan di bawah lebih besar, kelajuan lebih perlahan, dan kos lebih rendah; Dari atas ke bawah, setiap lapisan boleh dianggap sebagai cache lapisan seterusnya, iaitu: daftar L0 ialah cache bagi cache peringkat pertama L1, L1 ialah cache bagi L2, dan seterusnya; setiap lapisan berasal dari Lapisan di bawahnya, jadi data setiap lapisan ialah subset data lapisan seterusnya.

Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

Pada CPU moden, secara amnya, L0, L1, L2 dan L3 disepadukan di dalam CPU, dan L1 juga dibahagikan kepada cache data peringkat pertama (Data Cache, D -Cache, L1d) dan cache arahan peringkat pertama (Cache Arahan, I-Cache, L1i), yang digunakan untuk menyimpan data dan melaksanakan penyahkodan arahan data masing-masing. Setiap teras mempunyai unit pemprosesan pengkomputeran bebas, pengawal, daftar, cache L1 dan L2, dan kemudian berbilang teras CPU berkongsi lapisan terakhir cache CPU L3.

2. Model Memori Java (JMM)

Dari sudut pandangan abstrak, JMM mentakrifkan hubungan abstrak antara utas dan ingatan utama: pembolehubah yang dikongsi antara utas disimpan dalam memori utama (Memori Utama ), setiap satu thread mempunyai memori tempatan peribadi (Memori Tempatan), yang menyimpan salinan pembolehubah kongsi baca/tulis benang. Memori tempatan ialah konsep abstrak JMM dan tidak benar-benar wujud. Ia meliputi cache, penimbal tulis, daftar, dan pengoptimuman perkakasan dan pengkompil lain.

Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

2.1 Keterlihatan

Keterlihatan bermakna apabila berbilang benang mengakses pembolehubah yang sama, benang Jika nilai ini pembolehubah diubah suai, benang lain boleh melihat nilai yang diubah suai dengan serta-merta.
Memandangkan semua operasi pada pembolehubah mengikut benang mesti dilakukan dalam memori kerja dan tidak boleh membaca dan menulis secara langsung pembolehubah dalam ingatan utama, maka untuk pembolehubah kongsi V, mereka mula-mula berada dalam memori kerja mereka sendiri dan kemudian disegerakkan ke utama ingatan. Walau bagaimanapun, ia tidak akan dibuang ke memori utama dalam masa, tetapi akan terdapat perbezaan masa tertentu. Jelas sekali, pada masa ini, operasi thread A pada pembolehubah V tidak lagi kelihatan kepada thread B.
Untuk menyelesaikan masalah keterlihatan objek yang dikongsi, kita boleh menggunakan kata kunci atau kunci yang tidak menentu.

2.2.

Kita semua tahu bahawa sumber CPU diperuntukkan dalam unit benang dan dipanggil dalam cara perkongsian masa Sistem pengendalian membenarkan proses untuk dilaksanakan untuk tempoh masa yang singkat, seperti 50 milisaat sistem pengendalian akan memilih semula proses untuk dilaksanakan (kami memanggilnya "penukaran tugas"), 50 milisaat ini dipanggil "kepingan masa". Kebanyakan tugasan ditukar selepas segmen masa tamat.

Oleh kerana sistem pengendalian melakukan penukaran tugas, ia boleh berlaku selepas sebarang arahan CPU dilaksanakan! Ambil perhatian bahawa ia adalah arahan CPU, arahan CPU, arahan CPU, bukan pernyataan dalam bahasa peringkat tinggi. Sebagai contoh, kiraan hanyalah satu ayat dalam Java, tetapi dalam bahasa peringkat tinggi, pernyataan sering memerlukan beberapa arahan CPU untuk diselesaikan. Malah, kiraan mengandungi sekurang-kurangnya tiga arahan CPU!
3. Penjelasan terperinci tentang volatile
那么线程切换为什么会带来 bug 呢?3.1 Ciri-ciri tidak menentu

Anda boleh menganggap satu

untuk pembolehubah tidak menentu sebagai menggunakan kunci yang sama untuk mengunci single ini

Operasi disegerakkan

读/写读/写 boleh dilihat sebagai kod berikut:

public class Volati {


    //    使用volatile 声明一个64位的long型变量
    volatile long i = 0L;//    单个volatile 变量的读
    public long getI() {
        return i;
    }//    单个volatile 变量的写
    public void setI(long i) {
        this.i = i;
    }//    复合(多个)volatile 变量的 读/写
    public void iCount(){
        i ++;
    }}

Jadi pembolehubah yang tidak menentu itu sendiri mempunyai ciri-ciri berikut:

public class VolaLikeSyn {

    //    使用 long 型变量
    long i = 0L;
    public synchronized long getI() {
        return i;
    }//     对单个的普通变量的读用同一个锁同步
    public synchronized void setI(long i) {
        this.i = i;
    }//    普通方法调用
    public void iCount(){
        long temp = getI();   // 调用已同步的读方法
        temp = temp + 1L;     // 普通写操作
        setI(temp);           // 调用已同步的写方法
    }}

Keterlihatan

: Bacaan daripada pembolehubah tidak menentu sentiasa boleh melihat (mana-mana utas) tulisan terakhir kepada pembolehubah tidak menentu.
  • Atomicity: Membaca/menulis mana-mana pembolehubah meruap tunggal adalah atom, tetapi operasi kompaun seperti meruap bukan atom.
  • Walaupun tidak menentu boleh memastikan pembolehubah dialihkan ke memori utama dalam masa selepas pelaksanaan, untuk kiraan, situasi bukan atom, berbilang arahan, disebabkan penukaran benang, benang A baru sahaja memuatkan kiraan =0 Selepas mencapai memori kerja, utas B boleh mula berfungsi Ini akan menyebabkan hasil pelaksanaan utas A dan B menjadi kedua-duanya 1, dan kedua-duanya ditulis ke ingatan utama masih 1, bukan 2
  • 3.2 , Prinsip pelaksanaan tidak menentu

Pembolehubah yang diubah suai oleh kata kunci yang tidak menentu akan mempunyai awalan "kunci:".

Awalan kunci, Kunci bukan penghalang memori, tetapi ia boleh melaksanakan fungsi yang serupa dengan halangan memori. Lock mengunci bas CPU dan cache, yang boleh difahami sebagai kunci pada tahap arahan CPU.
  • Pada masa yang sama, arahan ini akan menulis data baris cache pemproses semasa terus ke memori sistem, dan operasi menulis ini akan membatalkan data yang dicache pada alamat ini dalam CPU lain.
  • 4. Prinsip pelaksanaan disegerakkan
  • Pelaksanaan Disegerakkan dalam JVM adalah berdasarkan masuk dan keluar dari objek Monitor untuk mencapai penyegerakan kaedah dan penyegerakan blok kod, walaupun khusus butiran pelaksanaan adalah berbeza, tetapi semuanya boleh dicapai melalui pasangan arahan MonitorEnter dan MonitorExit.
Untuk blok disegerakkan, arahan MonitorEnter dimasukkan pada permulaan blok kod disegerakkan, manakala arahan monitorExit dimasukkan pada penghujung kaedah dan pengecualian JVM menjamin bahawa setiap MonitorEnter mesti mempunyai MonitorExit yang sepadan. Secara umum, apabila kod melaksanakan arahan ini, ia akan cuba mendapatkan pemilikan objek Monitor, iaitu, cuba dapatkan kunci objek:

  1. Jika nombor kemasukan monitor ialah 0, maka benang memasuki monitor, dan kemudian menetapkan nombor masukan kepada 1, dan benang menjadi pemilik monitor.
  2. Jika utas sudah menduduki monitor dan baru masuk semula, bilangan entri ke dalam monitor ditambah sebanyak 1.
  3. Jika utas lain telah menduduki monitor, utas akan memasuki keadaan menyekat sehingga nombor kemasukan monitor ialah 0, dan kemudian cuba mendapatkan pemilikan monitor sekali lagi. Untuk kaedah penyegerakan, berdasarkan keputusan penyahkompilasi kaedah penyegerakan, penyegerakan kaedah tidak dilaksanakan melalui arahan monitorenter dan monitorexit Berbanding dengan kaedah biasa, kolam malar mempunyai pengecam ACC_SYNCHRONIZED tambahan.
    JVM melaksanakan penyegerakan kaedah berdasarkan pengecam ini: apabila kaedah dipanggil, arahan panggilan akan menyemak sama ada bendera akses ACC_SYNCHRONIZED kaedah ditetapkan Jika ia ditetapkan, urutan pelaksanaan akan terlebih dahulu memperoleh monitor pemerolehan berjaya, Badan kaedah boleh dilaksanakan, dan monitor boleh dikeluarkan selepas kaedah dilaksanakan. Semasa pelaksanaan kaedah, tiada utas lain boleh mendapatkan objek monitor yang sama sekali lagi.

Kunci yang digunakan oleh disegerakkan disimpan dalam pengepala objek Java Pengepala objek objek Java terdiri daripada dua bahagian: tanda perkataan dan penunjuk kelas:

  1. tanda. kata menyimpan Status penyegerakan, bendera, kod cincang, status GC, dsb.
  2. penunjuk kelas menyimpan penunjuk jenis objek, yang menunjuk ke metadata kelasnya Selain itu, untuk tatasusunan, terdapat juga data yang merekodkan panjang tatasusunan.

Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

Maklumat kunci wujud dalam kata tanda objek Data lalai dalam MarkWord adalah untuk menyimpan Kod Hash dan maklumat lain objek.

Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

Tetapi ia akan berubah apabila operasi objek berubah keadaan kunci yang berbeza sepadan dengan kaedah penyimpanan rekod yang berbeza

Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

4.1. Status kunci

Membandingkan gambar di atas, kami mendapati terdapat empat status kunci,

tiada status kunci, status kunci berat sebelah, status kunci ringan dan status kunci kelas berat , ia akan beransur-ansur meningkat dengan situasi persaingan. Kunci boleh dinaik taraf tetapi tidak diturunkan untuk meningkatkan kecekapan memperoleh dan melepaskan kunci.

4.2. Kunci berat sebelah

Memperkenalkan latar belakang: Dalam kebanyakan kes, kunci bukan sahaja tidak mempunyai persaingan berbilang benang, tetapi ia sentiasa diperoleh beberapa kali oleh benang yang sama. Untuk membolehkan benang Kos memperoleh kunci adalah lebih rendah dan kunci berat sebelah diperkenalkan untuk mengurangkan operasi CAS yang tidak perlu. Kunci berat sebelah, seperti namanya, ia akan memihak kepada utas pertama untuk mengakses kunci Jika hanya satu utas mengakses kunci penyegerakan semasa operasi dan tiada perbalahan berbilang utas, utas tidak perlu mencetuskan penyegerakan. , Kurangkan beberapa operasi CAS mengunci/membuka kunci (seperti beberapa operasi CAS menunggu baris gilir dalam kes ini, kunci berat sebelah akan ditambahkan pada urutan). Jika benang lain mendahului kunci semasa operasi, benang yang memegang kunci berat sebelah akan digantung, dan JVM akan menghapuskan kunci berat sebelah padanya dan memulihkan kunci kepada kunci ringan standard. Ia meningkatkan lagi prestasi berjalan program dengan menghapuskan primitif penyegerakan apabila tiada persaingan untuk sumber.

Lihat gambar di bawah untuk memahami proses pemerolehan kunci bias:

Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

Langkah 1. Semak sama ada bendera kunci bias masuk Mark Word ditetapkan Jika ia adalah 1, sama ada bendera kunci ialah 01, sahkan bahawa ia berada dalam keadaan boleh dipesongkan.

Langkah 2. Jika ia berada dalam keadaan biasa, uji sama ada ID utas menghala ke utas semasa Jika ya, pergi ke langkah 5, jika tidak pergi ke langkah 3.
Langkah 3. Jika ID benang tidak menghala ke benang semasa, bersaing untuk mendapatkan kunci melalui operasi CAS. Jika pertandingan berjaya, tetapkan ID utas dalam Mark Word kepada ID utas semasa, dan kemudian jalankan 5 jika pertandingan gagal, jalankan 4;
Langkah 4. Jika CAS gagal memperoleh kunci bias, ini bermakna terdapat persaingan. Apabila mencapai titik selamat global (safepoint), benang yang memperoleh kunci pincang digantung, kunci pincang dinaik taraf kepada kunci ringan, dan kemudian benang yang disekat di titik selamat terus melaksanakan kod penyegerakan. (Membatalkan kunci bias akan menyebabkan perkataan terhenti)
Langkah 5. Jalankan kod penyegerakan.

Pelepasan kunci bias:

Pembatalan kunci berat sebelah disebut dalam langkah keempat di atas. Kunci bias hanya akan melepaskan kunci bias apabila benang lain cuba bersaing untuk kunci bias. Benang yang memegang kunci bias tidak akan mengambil inisiatif untuk melepaskan kunci bias. Untuk membatalkan kunci berat sebelah, anda perlu menunggu titik keselamatan global (tiada kod bait sedang dilaksanakan pada masa ini Ia akan menjeda benang yang memiliki kunci berat sebelah, tentukan sama ada objek kunci berada dalam keadaan terkunci). , dan kemudian pulihkan kunci berat sebelah kepada keadaan sebelumnya selepas membatalkan kunci berat sebelah Status kunci (bit bendera ialah "01") atau kunci ringan (bit bendera ialah "00").

Senario terpakai untuk kunci berat sebelah:

Sentiasa hanya ada satu utas yang melaksanakan blok penyegerakan Sebelum ia selesai melaksanakan dan melepaskan kunci, tiada utas lain akan melaksanakannya blok penyegerakan. Gunakannya apabila tiada persaingan untuk kunci Apabila terdapat persaingan, ia akan ditingkatkan kepada kunci ringan Apabila menaik taraf kepada kunci ringan, anda perlu membatalkan kunci bias hentikan operasi perkataan;
dalam Apabila berlaku persaingan kunci, kunci berat sebelah akan melakukan banyak operasi tambahan Terutama apabila membatalkan kunci berat sebelah, ia akan membawa kepada titik selamat akan menyebabkan stw kemerosotan prestasi. Dalam kes ini, ia harus dilumpuhkan.

jvm Hidupkan/matikan kunci pincang
Hidupkan kunci pincang: -XX: UseBiasedLocking -XX:BiasedLockingStartupDelay=0 Matikan kunci pincang: -XX:-UseBiasedLocking

4.3. Kunci ringan

Kunci ringan dinaik taraf daripada kunci berat sebelah berjalan apabila satu utas memasuki blok yang disegerakkan Apabila utas kedua bergabung dengan pertikaian kunci, kunci berat sebelah Kunci akan dinaik taraf kepada kunci ringan;

Proses penguncian kunci ringan:

  1. Apabila kod memasuki blok penyegerakan, jika penyegerakan Status kunci objek adalah bebas kunci dan berat sebelah tidak dibenarkan (bendera kunci ialah "01", dan sama ada ia adalah kunci berat sebelah ialah "0"). simpan salinan Mark Word semasa objek kunci, yang secara rasmi dipanggil Displaced Mark Word.
  2. Salin Kata Tanda dalam pengepala objek ke rekod kunci.
  3. Selepas salinan berjaya, mesin maya akan menggunakan operasi CAS untuk cuba mengemas kini Mark Word objek kepada penunjuk ke Rekod Kunci dan arahkan penuding pemilik dalam rekod Kunci ke perkataan tanda objek . Jika kemas kini berjaya, teruskan ke langkah 4, jika tidak, teruskan ke langkah 5.
  4. Jika tindakan kemas kini berjaya, maka urutan ini memiliki kunci objek dan bendera kunci objek Mark Word ditetapkan kepada "00", yang bermaksud objek itu berada dalam keadaan kunci ringan
  5. Jika operasi kemas kini ini gagal, mesin maya akan terlebih dahulu menyemak sama ada Mark Word objek menghala ke bingkai tindanan benang semasa. Jika ya, ini bermakna benang semasa sudah memiliki kunci ini objek, dan kemudian ia boleh terus memasuki blok penyegerakan untuk meneruskan. Jika tidak, ini bermakna berbilang benang bersaing untuk kunci, maka ia akan berputar dan menunggu kunci, dan objek kunci tidak diperolehi selepas beberapa kali. Penunjuk benang heavyweight menghala ke benang bersaing, dan benang bersaing juga akan menyekat, menunggu benang ringan melepaskan kunci dan membangunkannya. Nilai status bendera kunci berubah kepada "10". Apa yang disimpan dalam Mark Word ialah penunjuk kepada kunci heavyweight (mutex), dan benang seterusnya yang menunggu kunci juga akan memasuki keadaan menyekat.

4.3.1. Prinsip kunci putaran

Prinsip kunci putaran adalah sangat mudah Jika benang yang memegang kunci boleh melepaskan sumber kunci dalam masa yang singkat, maka mereka yang menunggu untuk bersaing Benang yang memegang kunci tidak perlu bertukar antara mod kernel dan mod pengguna untuk memasuki keadaan yang disekat dan digantung Mereka hanya perlu menunggu (berpusing) dan memperoleh kunci sejurus selepas benang yang memegang kunci melepaskan kunci . Dengan cara ini, Elakkan kos menukar antara benang pengguna dan kernel.
Tetapi pemutaran benang perlu menggunakan CPU secara terang-terangan, ini bermakna CPU melakukan kerja yang tidak berguna masa.
Jika masa pelaksanaan benang yang memegang kunci melebihi masa menunggu putaran maksimum dan kunci tidak dilepaskan, benang lain yang bersaing untuk kunci masih tidak akan dapat memperoleh kunci dalam masa menunggu maksimum , benang perbalahan akan Berhenti berputar dan memasuki keadaan menyekat.

4.3.2. Kebaikan dan Kelemahan Kunci Putaran

Kunci putaran mengurangkan sekatan benang sebanyak mungkin, bermakna persaingan untuk kunci tidak sengit dan masa kunci adalah sangat singkat. Dari segi prestasi, prestasi bertambah baik, kerana penggunaan putaran akan kurang daripada penggunaan operasi menyekat dan menggantung benang.
Tetapi jika persaingan untuk kunci adalah sengit, atau benang yang memegang kunci perlu menduduki kunci untuk masa yang lama untuk melaksanakan blok penyegerakan, adalah tidak sesuai untuk menggunakan kunci putaran pada masa ini, kerana putaran kunci sentiasa menduduki CPU sebelum memperoleh kunci Ia adalah kerja yang sia-sia dan menduduki lubang Penggunaan pemutaran benang adalah lebih besar daripada penggunaan operasi menyekat dan menggantung benang lain yang memerlukan cawan, mengakibatkan pembaziran daripada CPU.

4.3.3. Ambang masa kunci putaran

Tujuan kunci putaran adalah untuk menduduki sumber CPU tanpa melepaskannya, dan tunggu sehingga kunci diperoleh untuk memprosesnya dengan segera. Tetapi bagaimana untuk memilih masa pelaksanaan putaran? Jika masa pelaksanaan putaran terlalu lama, sejumlah besar benang akan berada dalam keadaan putaran dan menduduki sumber CPU, yang akan menjejaskan prestasi keseluruhan sistem. Jadi bilangan putaran adalah penting.
JVM Untuk pilihan bilangan putaran, jdk1.5 lalai kepada 10 kali Dalam 1.6, kunci putaran adaptif telah diperkenalkan bermakna masa putaran tidak lagi ditetapkan, tetapi ditentukan oleh putaran sebelumnya kunci. Ia ditentukan oleh masa putaran pada kunci yang sama dan status pemilik kunci Pada asasnya dianggap bahawa masa penukaran konteks bagi sesuatu utas adalah masa terbaik.

JDK1.6 medium-XX: UseSpinning menghidupkan kunci spin; selepas JDK1.7, parameter ini dialih keluar dan dikawal oleh jvm; 🎜>

4.3.4. Perbandingan kunci yang berbeza

Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

Pembelajaran yang disyorkan: "

tutorial video java

"Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java

Atas ialah kandungan terperinci Titik pengetahuan pengaturcaraan serentak untuk pembelajaran benang Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam