Rumah  >  Artikel  >  Java  >  Penjelasan terperinci tentang kunci serentak berbilang benang Java

Penjelasan terperinci tentang kunci serentak berbilang benang Java

WBOY
WBOYasal
2024-04-11 16:21:01956semak imbas

Mekanisme kunci konkurensi Java memastikan sumber yang dikongsi hanya diakses oleh satu utas dalam persekitaran berbilang benang. Jenisnya termasuk penguncian pesimis (peroleh kunci dan kemudian akses) dan penguncian optimistik (semak konflik selepas mengakses). Java menyediakan kelas kunci konkurensi terbina dalam seperti ReentrantLock (kunci mutex), Semaphore (semaphore) dan ReadWriteLock (kunci baca-tulis). Menggunakan kunci ini boleh memastikan akses selamat benang kepada sumber yang dikongsi, seperti memastikan bahawa apabila berbilang rangkaian mengakses pembilang pembolehubah dikongsi pada masa yang sama, hanya satu utas mengemas kini nilainya. . Untuk mengelakkan ini, Java menyediakan mekanisme kunci konkurensi, yang memastikan bahawa hanya satu utas mengakses sumber yang dikongsi pada satu masa.

Penjelasan terperinci tentang kunci serentak berbilang benang JavaJenis kunci konkurensi

Terdapat dua jenis kunci konkurensi di Jawa:

Kunci Pesimis: Diandaikan bahawa semua rangkaian akan mengakses sumber dikongsi, jadi kunci diperoleh sebelum mengakses sumber yang dikongsi. Ini mengakibatkan penukaran konteks yang lebih kerap, tetapi pada kos penyelarasan yang lebih rendah.

Kunci Optimistik:

Anggap bahawa kebanyakan utas tidak akan mengakses sumber kongsi, jadi konflik disemak hanya selepas mengakses sumber kongsi. Jika konflik berlaku, operasi akan dibatalkan. Ini menyebabkan lebih sedikit suis konteks, tetapi pada kos konflik yang lebih mungkin. .

Semaphore:

Semaphore mengira digunakan untuk mengawal bilangan maksimum urutan serentak yang mengakses sumber kongsi.

  • ReadWriteLock: Kunci baca-tulis yang membenarkan berbilang urutan membaca sumber yang dikongsi pada masa yang sama, tetapi hanya membenarkan satu urutan menulis kepada sumber yang dikongsi.
  • Kes praktikal
Andaikan kami mempunyai dua utas yang mengakses pembolehubah kongsi kaunter pada masa yang sama dan kami ingin memastikan bahawa hanya satu utas mengemas kini nilai kaunter kod> pada satu masa. Kita boleh menggunakan ReentrantLock untuk mencapai ini:

public class Counter {

    private int counter;
    private ReentrantLock lock = new ReentrantLock();

    public int getCounter() {
        lock.lock();
        try {
            return counter;
        } finally {
            lock.unlock();
        }
    }

    public void incrementCounter() {
        lock.lock();
        try {
            counter++;
        } finally {
            lock.unlock();
        }
    }
}
Dalam contoh ini, kedua-dua kaedah getCounter() dan incrementCounter() menggunakan kunci untuk memastikan akses kepada counter selamat untuk thread.

Atas ialah kandungan terperinci Penjelasan terperinci tentang kunci serentak berbilang benang 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