Rumah  >  Artikel  >  Java  >  Apakah peranan Semaphore dalam fungsi Java concurrency dan multi-threading?

Apakah peranan Semaphore dalam fungsi Java concurrency dan multi-threading?

WBOY
WBOYasal
2024-04-27 12:18:01964semak imbas

Semaphore ialah mekanisme untuk mengawal akses sumber berbilang benang dalam pengaturcaraan serentak Java Ia dilaksanakan dengan mencipta lesen Kiraan lesen ditentukan semasa permulaan, menunjukkan bilangan sumber yang dilindungi yang boleh diakses pada masa yang sama benang cuba mengakses sumber, ia akan mencuba Dapatkan lesen, jika tiada lesen tersedia, utas akan disekat sehingga lesen tersedia.

Apakah peranan Semaphore dalam fungsi Java concurrency dan multi-threading?

Peranan Semaphore dalam fungsi Java concurrency dan multi-threading

Semaphore ialah mekanisme penting dalam pengaturcaraan serentak Java, digunakan untuk mengawal akses sumber dalam senario berbilang benang. Ia melakukan ini dengan mencipta lesen untuk struktur data kongsi yang melindungi sumber.

Cara ia berfungsi

Semaphore menentukan kiraan lesen apabila dimulakan, yang menunjukkan bilangan maksimum urutan yang boleh mengakses sumber yang dilindungi pada masa yang sama. Apabila benang cuba mengakses sumber, ia cuba mendapatkan lesen pada semaphore. Jika tersedia, lesen diberikan dan benang boleh mengakses sumber. Jika tiada lesen tersedia, urutan akan disekat sehingga lesen tersedia.

Kes praktikal

Katakan kita mempunyai sumber yang dikongsi, iaitu barisan. Hanya 5 utas boleh mengakses baris gilir secara serentak. Kita boleh menggunakan Semaphore untuk memastikan ini:

import java.util.concurrent.Semaphore;
import java.util.Queue;

public class Example {
    private static final int MAX_ACCESS_COUNT = 5;
    private static Semaphore semaphore = new Semaphore(MAX_ACCESS_COUNT);
    private static Queue<Integer> queue = new ConcurrentLinkedQueue<>();

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(() -> accessQueue()).start();
        }
    }

    private static void accessQueue() {
        try {
            // 尝试获取一个许可证
            semaphore.acquire();

            // 访问队列
            queue.add((int) (Math.random() * 100));

            // 释放许可证
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Dalam contoh ini, semaphore dimulakan dengan 5 lesen. Ini memastikan bahawa hanya maksimum 5 utas boleh mengakses baris gilir secara serentak. Urutan lain akan disekat sehingga lesen tersedia.

Kesimpulan

Semaphore sangat berguna dalam mengawal akses serentak kepada sumber yang dikongsi. Ia membantu mengelakkan perlumbaan data dan ketidakkonsistenan dengan mengehadkan bilangan utas yang boleh mengakses sumber secara serentak.

Atas ialah kandungan terperinci Apakah peranan Semaphore dalam fungsi Java concurrency dan multi-threading?. 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