Rumah  >  Artikel  >  Java  >  Bagaimana untuk menggunakan kunci dan penyegerak dalam pengaturcaraan serentak Java?

Bagaimana untuk menggunakan kunci dan penyegerak dalam pengaturcaraan serentak Java?

PHPz
PHPzasal
2024-05-08 22:06:02872semak imbas

Java menyediakan kunci dan penyegerak untuk mengurus akses kepada sumber yang dikongsi. Kunci seperti ReentrantLock membenarkan hanya satu utas untuk mengakses bahagian kritikal pada satu masa, manakala penyegerak seperti Semaphore dan CountDownLatch menyediakan kawalan serentak yang lebih fleksibel, seperti mengehadkan bilangan utas yang mengakses sumber secara serentak atau menunggu semua utas menyelesaikan tugas mereka . Menggunakan mekanisme ini dengan berkesan boleh mengelakkan perlumbaan data dan meningkatkan prestasi aplikasi.

Java 并发编程中如何使用锁和同步器?

Kunci dan Penyegerak dalam Pengaturcaraan Serentak Java

Pengaturcaraan serentak membolehkan berbilang urutan dilaksanakan secara serentak, tetapi memerlukan mekanisme untuk mengurus akses kepada sumber yang dikongsi. Java menyediakan pelbagai kunci dan penyegerak untuk mencapai matlamat ini.

Kunci

Kunci membenarkan hanya satu utas untuk mengakses bahagian kritikal (bahagian yang diubah suai daripada sumber yang dikongsi) pada satu masa. Kunci yang biasa digunakan ialah:

// 创建一个 ReentrantLock
Lock lock = new ReentrantLock();

// 获取锁
lock.lock();

// 访问临界区
// ...

// 释放锁
lock.unlock();

Penyegerak

Penyegerak lebih maju daripada kunci dan menyediakan kawalan serentak yang lebih fleksibel. Penyegerak yang biasa digunakan ialah:

Semaphore

Semaphore mengehadkan bilangan utas yang boleh mengakses sumber pada masa yang sama.

// 创建一个 Semaphore,允许最多 3 个线程同时访问
Semaphore semaphore = new Semaphore(3);

// 申请许可证
semaphore.acquire();

// 访问临界区
// ...

// 释放许可证
semaphore.release();

CountDownLatch

CountDownLatch menunggu semua urutan menyelesaikan tugas mereka sebelum meneruskan.

// 创建一个 CountDownLatch,等待 10 个线程完成
CountDownLatch latch = new CountDownLatch(10);

// 10 个线程执行任务
// ...

// 每个线程完成后,计数器减一
latch.countDown();

// 主线程等待所有线程完成
latch.await();

Kes praktikal

Berikut ialah kes praktikal operasi akaun bank, menggunakan Semaphore untuk mengehadkan bilangan utas yang mengakses akaun pada masa yang sama:

class BankAccount {
    private Semaphore semaphore = new Semaphore(1);
    private double balance;

    public void deposit(double amount) {
        try {
            semaphore.acquire();
            balance += amount;
        } finally {
            semaphore.release();
        }
    }

    public void withdraw(double amount) {
        try {
            semaphore.acquire();
            balance -= amount;
        } finally {
            semaphore.release();
        }
    }
}

Kesimpulan

Kunci dan penyegerak digunakan mengurus akses kepada sumber yang dikongsi dalam alat berkuasa pengaturcaraan serentak Java. Dengan menggunakan mekanisme ini dengan berhati-hati, anda boleh mengelakkan perlumbaan data dengan berkesan dan meningkatkan prestasi program.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan kunci dan penyegerak dalam pengaturcaraan serentak 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