Jadual Kandungan
Apakah kata kunci volatile ?
Bilakah Menggunakan volatile
Apakah kata kunci synchronized ?
Contoh: Menggunakan synchronized
Bagaimana synchronized memastikan penglihatan
Perbezaan Utama: volatile vs synchronized
Perangkap biasa dan amalan terbaik
Contoh: Mengapa volatile tidak cukup untuk count
Alternatif: AtomicInteger , ReentrantLock , dll.
Ringkasan
Rumah Java javaTutorial Keselamatan Thread di Java: Panduan untuk `Volatile` dan` Disegerakkan`

Keselamatan Thread di Java: Panduan untuk `Volatile` dan` Disegerakkan`

Jul 30, 2025 am 02:43 AM

Kedua-dua masalah keselamatan benang yang tidak menentu dan disegerakkan di Java, tetapi fungsi mereka berbeza: 1. Volatile memastikan penglihatan pembolehubah, memastikan bahawa membaca dan menulis secara langsung berinteraksi dengan memori utama di bawah pelbagai threading, dan sesuai untuk senario membaca dan menulis satu-satunya seperti bendera status, tetapi tidak memberikan atomisitas; 2. Disegerakkan menyediakan atomik dan penglihatan, dan memastikan bahawa hanya satu benang yang melaksanakan blok kod pada masa yang sama melalui kunci mutex, yang sesuai untuk operasi komposit seperti kiraan; 3. Volatile tidak boleh menggantikan diselaraskan, dan untuk operasi bukan atom, kelas alat yang disegerakkan atau serentak seperti atomicInteger masih diperlukan. Pemilihan alat yang betul dapat memastikan keselamatan dan kecekapan benang.

Keselamatan Thread di Java: Panduan untuk `Volatile` dan` Disegerakkan`

Di Java, keselamatan benang adalah kritikal apabila pelbagai benang mengakses data bersama. Tanpa penyegerakan yang betul, program dapat menunjukkan tingkah laku yang tidak dapat diramalkan disebabkan oleh keadaan kaum, isu penglihatan, dan keadaan yang tidak konsisten. Dua alat utama untuk menguruskan keselamatan benang volatile dan synchronized . Walaupun kedua -duanya membantu dengan keserasian, mereka melayani tujuan yang berbeza dan tidak boleh ditukar ganti.

Keselamatan Thread di Java: Panduan untuk `Volatile` dan` Disegerakkan`

Mari kita pecahkan bagaimana setiap kerja, bila menggunakannya, dan masalah yang mereka selesaikan.


Apakah kata kunci volatile ?

Kata kunci volatile memastikan penglihatan perubahan kepada pembolehubah di seluruh benang. Apabila pemboleh ubah diisytiharkan volatile , ia memberitahu JVM:

Keselamatan Thread di Java: Panduan untuk `Volatile` dan` Disegerakkan`
  • Menulis kepada pembolehubah ini segera dibuang ke ingatan utama.
  • Bacaan pembolehubah ini selalu datang dari ingatan utama, bukan dari cache tempatan benang.

Ini menghalang benang daripada menggunakan nilai cache yang basi-isu biasa dalam persekitaran pelbagai threaded.

Contoh: Menggunakan volatile

 VolatileExample kelas awam {
    Boolean yang tidak menentu peribadi berjalan = benar;

    hentian void awam () {
        berjalan = palsu;
    }

    public void run () {
        Semasa (berlari) {
            // buat kerja
        }
        System.out.println ("Berhenti");
    }
}

Dalam contoh ini, satu panggilan benang run() dan panggilan lain stop() . Tanpa volatile , benang run() mungkin tidak pernah melihat nilai yang dikemas kini running kerana ia boleh di -cache dalam memori CPU. Dengan volatile , perubahan itu dijamin dapat dilihat.

Keselamatan Thread di Java: Panduan untuk `Volatile` dan` Disegerakkan`

Bilakah Menggunakan volatile

Gunakan volatile apabila:

  • Pembolehubah dibaca dan ditulis oleh pelbagai benang.
  • Pembolehubah tidak bergantung pada nilai sebelumnya (iaitu, tiada operasi kompaun seperti count ).
  • Anda hanya memerlukan penglihatan , bukan atom.

❌ Jangan gunakan volatile untuk operasi seperti x - mereka bukan atom walaupun pembolehubah tidak menentu.


Apakah kata kunci synchronized ?

synchronized menyediakan kedua -dua pengecualian bersama (hanya satu benang yang boleh melaksanakan blok/kaedah pada satu masa) dan penglihatan (perubahan yang dibuat di dalam blok yang disegerakkan dapat dilihat oleh benang lain).

Ia boleh digunakan untuk:

  • Kaedah contoh (kunci pada contoh)
  • Kaedah statik (kunci pada objek kelas)
  • Blok kod (dengan objek kunci yang ditentukan)

Contoh: Menggunakan synchronized

 kaunter kelas awam {
    kiraan int swasta = 0;

    Peningkatan Kekosongan Segereh Public () {
        kiraan; // Operasi atom disebabkan oleh penyegerakan
    }

    Int GetCount yang disegerakkan awam () {
        kiraan pulangan;
    }
}

Di sini, synchronized memastikan bahawa hanya satu benang yang dapat melaksanakan increment() atau getCount() pada satu masa, menghalang keadaan kaum pada count .

Bagaimana synchronized memastikan penglihatan

Apabila benang memasuki blok synchronized , ia memperoleh kunci monitor dan:

  • Memancarkan cache tempatannya.
  • Muat semula pembolehubah dari memori utama.

Apabila ia keluar, ia menulis perubahan kembali ke ingatan utama. Jadi, seperti volatile , ia menjamin penglihatan - tetapi dengan atom yang ditambah.


Perbezaan Utama: volatile vs synchronized

Ciri volatile synchronized
Atom Tidak (hanya untuk baca/tulis tunggal) Ya (keseluruhan blok/kaedah)
Penglihatan Ya Ya
Pengecualian bersama Tidak Ya
Prestasi Ringan Lebih berat (mengunci monitor)
Berkenaan untuk Pembolehubah sahaja Kaedah dan blok kod

Perangkap biasa dan amalan terbaik

  • ✅ Gunakan volatile untuk bendera negeri (contohnya, shutdownRequested , initialized ).
  • ✅ Gunakan synchronized apabila anda memerlukan atomik (contohnya, kenaikan, mengemas kini pelbagai pembolehubah).
  • ❌ Jangan menganggap volatile membuat operasi kompaun selamat.
  • ❌ Elakkan terlalu banyak synchronized - ia boleh menyebabkan pertikaian dan mengurangkan prestasi.

Contoh: Mengapa volatile tidak cukup untuk count

 kelas awam badcounter {
    kiraan int volatile peribadi = 0;

    kenaikan void awam () {
        kiraan; // bukan atom: baca, kenaikan, tulis
    }
}

Walaupun count volatile , count melibatkan tiga langkah. Dua benang boleh membaca nilai yang sama, yang membawa kepada kemas kini yang hilang. Anda perlu synchronized atau AtomicInteger .


Alternatif: AtomicInteger , ReentrantLock , dll.

Untuk prestasi dan fleksibiliti yang lebih baik, pertimbangkan:

  • AtomicInteger , AtomicLong , dan lain -lain - Menyediakan operasi atom tanpa menyekat.
  • java.util.concurrent.locks.ReentrantLock - Lebih banyak kawalan daripada synchronized .

Contoh dengan AtomicInteger :

 kiraan atomicInteger swasta = AtomicInteger baru (0);

kenaikan void awam () {
    Count.IncrementAndget (); // benang-selamat dan cekap
}

Ringkasan

  • Gunakan volatile untuk bendera bersama mudah di mana anda memerlukan penglihatan tetapi tidak atom.
  • Gunakan synchronized apabila anda memerlukan kedua -dua atomik dan penglihatan , terutamanya untuk operasi kompaun.
  • Memahami bahawa volatile tidak menggantikan synchronized - mereka menyelesaikan bahagian -bahagian yang berlainan dari teka -teki konvensional.

Keselamatan Thread bukan sekadar menghalang kemalangan - ia mengenai memastikan ketepatan di bawah akses serentak. Memilih alat yang betul (kelas volatile , synchronized , atau atom) menjadikan kod anda selamat dan cekap.

Atas ialah kandungan terperinci Keselamatan Thread di Java: Panduan untuk `Volatile` dan` Disegerakkan`. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1517
276
Penanda aras prestasi benang maya java Penanda aras prestasi benang maya java Jul 21, 2025 am 03:17 AM

Benang maya mempunyai kelebihan prestasi yang signifikan dalam senario yang sangat konkurensi dan intensif, tetapi perhatian harus dibayar kepada kaedah ujian dan senario yang berkenaan. 1. Ujian yang betul harus mensimulasikan perniagaan sebenar, terutamanya senario menyekat IO, dan menggunakan alat seperti JMH atau Gatling untuk membandingkan benang platform; 2. Jurang throughput adalah jelas, dan boleh beberapa kali hingga sepuluh kali lebih tinggi daripada 100,000 permintaan serentak, kerana ia lebih ringan dan cekap dalam penjadualan; 3. Semasa ujian, adalah perlu untuk mengelakkan membabi buta mengejar nombor konvensional yang tinggi, menyesuaikan diri dengan model IO yang tidak menyekat, dan memberi perhatian kepada petunjuk pemantauan seperti latensi dan GC; 4.

Melaksanakan senarai yang dipautkan di Java Melaksanakan senarai yang dipautkan di Java Jul 20, 2025 am 03:31 AM

Kunci untuk melaksanakan senarai yang dipautkan adalah untuk menentukan kelas nod dan melaksanakan operasi asas. ①First Buat kelas nod, termasuk data dan rujukan kepada nod seterusnya; ② Kemudian buat kelas LinkedList, melaksanakan fungsi penyisipan, penghapusan dan percetakan; Kaedah tambahan digunakan untuk menambah nod pada ekor; ④ Kaedah PrintList digunakan untuk mengeluarkan kandungan senarai yang dipautkan; ⑤ Kaedah DeletewithValue digunakan untuk memadam nod dengan nilai tertentu dan mengendalikan situasi yang berbeza dari nod kepala dan nod perantaraan.

cara menetapkan pembolehubah persekitaran java_home di tingkap cara menetapkan pembolehubah persekitaran java_home di tingkap Jul 18, 2025 am 04:05 AM

Tosetjava_homeonwindows, firstlocatethejdkinstallationpath (mis., C: \ Programfiles \ java \ jdk-17), thencreateasystemenvironmentvaria blenamedjava_homewiththatpath.next, updateThePathvariableByadding%java \ _home%\ bin, andverifythesetupingjava-versionandjavac-v

Bagaimana menangani transaksi di Java dengan JDBC? Bagaimana menangani transaksi di Java dengan JDBC? Aug 02, 2025 pm 12:29 PM

Untuk mengendalikan transaksi JDBC dengan betul, anda mesti terlebih dahulu mematikan mod komit automatik, kemudian melakukan pelbagai operasi, dan akhirnya melakukan atau mengembalikan semula hasilnya; 1. Panggil Conn.SetAutOcommit (palsu) untuk memulakan transaksi; 2. Melaksanakan pelbagai operasi SQL, seperti memasukkan dan mengemaskini; 3. Panggil Conn.Commit () jika semua operasi berjaya, dan hubungi conn.rollback () jika pengecualian berlaku untuk memastikan konsistensi data; Pada masa yang sama, cuba-dengan-sumber harus digunakan untuk menguruskan sumber, mengendalikan pengecualian dengan betul dan menutup sambungan untuk mengelakkan kebocoran sambungan; Di samping itu, adalah disyorkan untuk menggunakan kolam sambungan dan menetapkan mata simpan untuk mencapai rollback separa, dan menyimpan urus niaga sesingkat mungkin untuk meningkatkan prestasi.

Java Microservices Perkhidmatan Mesh Integrasi Java Microservices Perkhidmatan Mesh Integrasi Jul 21, 2025 am 03:16 AM

ServiceMesh adalah pilihan yang tidak dapat dielakkan untuk evolusi seni bina microservice Java, dan terasnya terletak pada decoupling logik rangkaian dan kod perniagaan. 1. ServiceMesh mengendalikan pengimbangan beban, fius, pemantauan dan fungsi lain melalui agen sidecar untuk memberi tumpuan kepada perniagaan; 2. INTOR ISTIO sesuai untuk projek sederhana dan besar, dan Linkerd lebih ringan dan sesuai untuk ujian berskala kecil; 3. Java microservices harus menutup, reben dan komponen lain dan menyerahkannya kepada Istiod untuk penemuan dan komunikasi; 4. Memastikan suntikan automatik sidecar semasa penempatan, perhatikan konfigurasi peraturan lalu lintas, keserasian protokol, dan pembinaan sistem penjejakan log, dan mengamalkan penghijrahan tambahan dan perancangan pemantauan pra-kawalan.

Membandingkan kerangka Java: Spring Boot vs Quarkus vs Micronaut Membandingkan kerangka Java: Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pra-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless scenarios.tyvelopecosyste,

Pengoptimuman Rangka Kerja Koleksi Lanjutan Pengoptimuman Rangka Kerja Koleksi Lanjutan Jul 20, 2025 am 03:48 AM

Untuk meningkatkan prestasi Rangka Kerja Koleksi Java, kami dapat mengoptimumkan dari empat mata berikut: 1. Pilih jenis yang sesuai mengikut senario, seperti akses rawak yang kerap ke ArrayList, carian cepat ke hashset, dan serentak untuk persekitaran serentak; 2. Menetapkan kapasiti dan faktor beban yang munasabah semasa permulaan untuk mengurangkan overhead pengembangan kapasiti, tetapi elakkan sisa memori; 3. Gunakan set yang tidak berubah (seperti list.of ()) untuk meningkatkan keselamatan dan prestasi, sesuai untuk data tetap atau baca sahaja; 4. Mencegah kebocoran memori, dan gunakan rujukan lemah atau perpustakaan cache profesional untuk menguruskan set survival jangka panjang. Butiran ini memberi kesan ketara kepada kestabilan dan kecekapan program.

Membina API Restful di Jawa dengan Jakarta EE Membina API Restful di Jawa dengan Jakarta EE Jul 30, 2025 am 03:05 AM

SetupaMaven/gradleprojectwithjax-rsdependencyiSejersey; 2.createarescresourceUsingAnnotationssuchas@pathand@get; 3.configuretheapplicationviaapplicationsubclassorweb.xml;

See all articles