Rumah  >  Artikel  >  Java  >  Teknik Mengurus Concurrency dalam Java Menggunakan Semaphore

Teknik Mengurus Concurrency dalam Java Menggunakan Semaphore

Susan Sarandon
Susan Sarandonasal
2024-11-01 11:02:02791semak imbas

1. Apakah Semaphore di Jawa?

Techniques for Managing Concurrency in Java Using Semaphores

Semaphore dalam Java ialah bantuan penyegerakan yang mengehadkan bilangan utas yang boleh mengakses sumber yang dikongsi pada bila-bila masa. Ia adalah sebahagian daripada pakej java.util.concurrent dan digunakan untuk mengurus akses serentak kepada sumber, seperti fail, pangkalan data atau sambungan rangkaian.

1.1 Bagaimana Semaphore Berfungsi?

Techniques for Managing Concurrency in Java Using Semaphores

Semafor mengawal akses kepada beberapa set permit. Setiap permit mewakili hak untuk mengakses sumber tertentu. Semaphore menjejaki bilangan permit yang tersedia, yang menentukan bilangan utas yang boleh mengakses sumber secara serentak.

Permit : Token atau tiket yang membenarkan urutan meneruskan mengakses sumber kongsi.

Apabila anda mencipta semafor, anda menyatakan bilangan permit yang tersedia. Nombor ini mentakrifkan bilangan utas yang boleh mengakses sumber secara serentak.

Sebelum benang boleh mengakses sumber, ia mesti memperoleh permit daripada semaphore. Ini dilakukan menggunakan kaedah acquire().

Peroleh : Kaedah ini dipanggil apabila benang ingin mengakses sumber. Jika permit tersedia, semaphore mengurangkan bilangan permit yang tersedia dan membenarkan utas untuk diteruskan. Jika tiada permit tersedia, utas akan disekat sehingga permit tersedia.

Kelakuan Menyekat : Jika tiada permit tersedia, urutan yang memanggil acquire() akan disekat (iaitu, ia akan menunggu) sehingga urutan lain mengeluarkan permit.

Setelah benang selesai menggunakan sumber, ia harus mengeluarkan permit untuk menyediakannya untuk urutan lain. Ini dilakukan menggunakan kaedah release().

Keluaran : Kaedah ini menambah bilangan permit yang ada. Jika terdapat sebarang utas menunggu permit, salah satu daripadanya akan dinyahsekat dan dibenarkan untuk memperoleh permit.

1.2 Jenis Semaphore

Terdapat dua jenis semaphore di Jawa:

  • Mengira Semaphore : Semaphore jenis ini membenarkan bilangan set urutan untuk mengakses sumber. Contohnya, jika anda menetapkan semafor kepada 3, hanya tiga utas boleh mengakses sumber pada masa yang sama.
  • Binary Semaphore (Mutex): Ini ialah kes khas mengira semaphore dengan bilangan permit adalah satu, membenarkan hanya satu thread mengakses sumber pada satu-satu masa. Ia sering digunakan sebagai kunci pengecualian bersama (mutex).

2. Melaksanakan Semaphore di Jawa

Untuk lebih memahami cara semafor berfungsi, mari lihat pelaksanaan praktikal. Kami akan mencipta senario mudah di mana beberapa utas cuba mengakses sumber terhad.

2.1 Menyediakan Persekitaran

import java.util.concurrent.Semaphore;

public class SemaphoreDemo {

    // Creating a semaphore with 3 permits
    private static final Semaphore semaphore = new Semaphore(3);

    public static void main(String[] args) {
        // Creating and starting 6 threads
        for (int i = 1; i <= 6; i++) {
            new WorkerThread("Worker " + i).start();
        }
    }

    static class WorkerThread extends Thread {
        private String name;

        WorkerThread(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            try {
                System.out.println(name + " is trying to acquire a permit...");
                // Acquiring the semaphore
                semaphore.acquire();
                System.out.println(name + " acquired a permit.");

                // Simulating work by sleeping
                Thread.sleep(2000);

                System.out.println(name + " is releasing a permit.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // Releasing the semaphore
                semaphore.release();
            }
        }
    }
}

2.2 Penjelasan Kod

Dalam contoh ini, kami mencipta semaphore dengan tiga permit, bermakna hanya tiga utas boleh mengakses bahagian kritikal kod pada bila-bila masa. Kami kemudian mencipta enam utas, yang kesemuanya cuba mendapatkan permit. Setelah benang memperoleh permit, ia mensimulasikan beberapa kerja dengan tidur selama dua saat sebelum melepaskan permit.

2.3 Memerhati Output

Apabila anda menjalankan kod di atas, output akan kelihatan seperti ini:

Worker 1 is trying to acquire a permit...
Worker 1 acquired a permit.
Worker 2 is trying to acquire a permit...
Worker 2 acquired a permit.
Worker 3 is trying to acquire a permit...
Worker 3 acquired a permit.
Worker 4 is trying to acquire a permit...
Worker 5 is trying to acquire a permit...
Worker 6 is trying to acquire a permit...
Worker 1 is releasing a permit.
Worker 4 acquired a permit.
Worker 2 is releasing a permit.
Worker 5 acquired a permit.
Worker 3 is releasing a permit.
Worker 6 acquired a permit.

Di sini, tiga utas pertama berjaya memperoleh permit dan memulakan tugas mereka. Benang yang tinggal mesti menunggu sehingga permit dikeluarkan sebelum ia boleh meneruskan.

2.4 Kes Penggunaan Praktikal

Semaphore amat berguna dalam senario di mana anda perlu mengehadkan bilangan akses serentak kepada sumber tertentu, seperti:

  • Menghadkan sambungan pangkalan data
  • Mengawal akses kepada fail kongsi
  • Mengurus sambungan rangkaian dalam pelayan

3. Kebaikan dan Keburukan Menggunakan Semaphore

Walaupun semaphore adalah alat yang berkuasa, ia datang dengan set kelebihan dan kekurangan mereka sendiri.

3.1 Kelebihan

Fleksibiliti : Semaphore membolehkan kawalan tepat ke atas akses sumber oleh berbilang rangkaian.

Skalabiliti : Semaphore boleh mengurus akses kepada sejumlah besar sumber dengan mudah.

Kesaksamaan : Semaphore boleh dikonfigurasikan untuk memastikan rangkaian memperoleh permit dengan cara yang adil.

3.2 Kelemahan

Kerumitan : Menggunakan semafor boleh memperkenalkan kerumitan ke dalam kod anda, menjadikannya lebih sukar untuk nyahpepijat.

Kebuntuan : Jika tidak dikendalikan dengan betul, semafor boleh menyebabkan kebuntuan di mana benang disekat selama-lamanya menunggu permit.

4. Amalan Terbaik untuk Menggunakan Semaphore di Jawa

Untuk mengelakkan perangkap biasa dan memanfaatkan semaphore sepenuhnya, pertimbangkan amalan terbaik berikut:

4.1 Gunakan tryAcquire untuk Pemerolehan Terhad Masa

Daripada menggunakan acquire(), yang menyekat selama-lamanya, anda boleh menggunakan tryAcquire() untuk cuba memperoleh permit dengan tamat masa. Ini menghalang urutan daripada tersekat menunggu.

import java.util.concurrent.Semaphore;

public class SemaphoreDemo {

    // Creating a semaphore with 3 permits
    private static final Semaphore semaphore = new Semaphore(3);

    public static void main(String[] args) {
        // Creating and starting 6 threads
        for (int i = 1; i <= 6; i++) {
            new WorkerThread("Worker " + i).start();
        }
    }

    static class WorkerThread extends Thread {
        private String name;

        WorkerThread(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            try {
                System.out.println(name + " is trying to acquire a permit...");
                // Acquiring the semaphore
                semaphore.acquire();
                System.out.println(name + " acquired a permit.");

                // Simulating work by sleeping
                Thread.sleep(2000);

                System.out.println(name + " is releasing a permit.");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // Releasing the semaphore
                semaphore.release();
            }
        }
    }
}

4.2 Sentiasa Keluarkan Permit dalam Blok akhirnya

Untuk mengelakkan kebocoran sumber, sentiasa keluarkan permit dalam blok akhirnya. Ini memastikan permit dikeluarkan walaupun pengecualian berlaku.

4.3 Elakkan Menggunakan Semaphore untuk Kunci Mudah

Jika anda hanya perlu mengunci dan membuka kunci sumber untuk satu utas, pertimbangkan untuk menggunakan ReentrantLock atau disegerakkan dan bukannya semafor binari.

5. Kesimpulan

Semaphore ialah alat yang berkuasa untuk mengurus konkurensi dalam Java, membolehkan anda mengawal bilangan utas yang mengakses sumber yang dikongsi. Dengan mengikuti teknik dan amalan terbaik yang digariskan dalam artikel ini, anda boleh melaksanakan semafor dengan berkesan dalam aplikasi Java anda untuk memastikan pengurusan sumber yang selamat dan cekap.

Jika anda mempunyai sebarang soalan atau ingin berkongsi pengalaman anda sendiri dengan semaphore, sila komen di bawah!

Baca siaran lebih lanjut di : Teknik Mengurus Concurrency dalam Java Menggunakan Semaphore

Atas ialah kandungan terperinci Teknik Mengurus Concurrency dalam Java Menggunakan Semaphore. 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