Rumah  >  Artikel  >  Java  >  Bagaimana untuk mencapai keselamatan benang dalam blok disegerakkan fungsi Java?

Bagaimana untuk mencapai keselamatan benang dalam blok disegerakkan fungsi Java?

王林
王林asal
2024-05-01 21:15:01602semak imbas

Blok disegerakkan fungsi Java mencapai keselamatan benang dengan memperoleh kunci penyegerakan Apabila benang memasuki blok disegerakkan, utas lain tidak boleh masuk, memastikan akses kepada data yang dikongsi selamat untuk benang. Langkah khusus: Isytihar kaedah disegerakkan atau blok kod dan gunakan kata kunci disegerakkan. Apabila benang memasuki blok disegerakkan, ia memperoleh kunci penyegerakan. Urutan lain tidak boleh mengakses data dalam blok disegerakkan sehingga utas pertama melepaskan kunci penyegerakan. Blok yang disegerakkan mengandungi hanya kod yang perlu disegerakkan.

Java 函数的同步块如何实现线程安全?

Bagaimana untuk mencapai keselamatan benang dalam blok disegerakkan fungsi Java?

Blok disegerakkan ialah gula sintaktik yang digunakan untuk menjadikan fungsi tidak selamat untuk benang dalam persekitaran berbilang benang. Ia pada asasnya adalah kunci mutex, apabila benang memasuki blok disegerakkan, ia memperoleh kunci disegerakkan dan tiada benang lain boleh memasuki blok disegerakkan sehingga benang itu melepaskan kunci. . Jika berbilang benang memanggil fungsi ini pada masa yang sama, nilai pembilang mungkin tidak betul. Kita boleh menggunakan blok disegerakkan untuk menyelesaikan masalah ini:

public synchronized void myFunc() {
    // 临界区代码
}

Dengan cara ini, apabila urutan memanggil fungsi increment(), ia akan memperoleh kunci eksklusif pada counter. Tiada urutan lain boleh mengakses counter sehingga urutan pertama melepaskan kunci, memastikan akses kepada counter selamat untuk thread.

Perlu diambil perhatian bahawa:

    Anda hanya boleh menggunakan kata kunci disegerakkan untuk menyegerakkan kaedah atau blok kod, bukan kelas.

    Blok disegerakkan hanya sah dalam blok kod Sebaik sahaja benang meninggalkan blok disegerakkan, benang lain boleh masuk. increment(),它将一个计数器值加 1。如果多个线程同时调用此函数,则计数器值可能会发生错误。我们可以使用同步块来解决这个问题:

    private int counter;
    
    public synchronized void increment() {
        counter++;
    }

    这样,当一个线程调用 increment() 函数时,它会获取对 counter 的独占锁。其他线程在第一个线程释放该锁之前都无法访问 counter,从而确保对 counter 的访问是线程安全的。

    需要注意的是:

    • 只能使用 synchronized
    • Jangan sarang blok yang disegerakkan dalam blok yang disegerakkan, ini boleh menyebabkan kebuntuan.
    • Cuba pastikan blok penyegerakan sekecil mungkin, meliputi hanya kod yang perlu disegerakkan.

    Atas ialah kandungan terperinci Bagaimana untuk mencapai keselamatan benang dalam blok disegerakkan fungsi Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Kenyataan:
    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