Класс инструментов параллелизма Java (семафор Semaphore)

Java

Класс инструмента параллелизма:

Класс инструмента параллелизма Java (защелка CountDownLatch)

Класс инструментов параллелизма Java (CyclicBarrier)

Класс инструментов параллелизма Java (семафор Semaphore)

определение

Счетные семафоры используются для управления количеством операций, которые одновременно обращаются к определенному ресурсу или выполняют указанную операцию одновременно. Семафоры также можно использовать для реализации некоторого объединения ресурсов или для наложения ограничений на контейнеры.

Semaphoreуправлять группойразрешение, Начальное количество лицензий можно задать через конструктор.При работе сначала необходимо получить лицензию, прежде чем можно будет выполнять операцию.После завершения операции лицензию необходимо освободить. Если разрешение не было получено, заблокируйте, пока разрешение не будет освобождено. Если лицензия инициализирована как1изSemaphore, то он эквивалентен нереентерабельному мьютексу (Mutex).

Пример сцены

Теория звучит несколько запутанно, но на самом деле предполагается обычная сцена из жизни: каждое утро все стремятся в платный туалет, а в фирменном туалете есть только10个坑位。 .那么只能同时10Индивидуальные лица используются, они должны ждать (блокировать), если они ушли2индивидуально, то можно снова зайти2личный. вотSemaphoreсценариев приложений, конкурирующих за ограниченные ресурсы.

Кодовый бой

package concurrency;

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;


class Employee implements Runnable {
    private String id;
    private Semaphore semaphore;
    private static Random rand= new Random(47);

    public Employee(String id, Semaphore semaphore) {
        this.id = id;
        this.semaphore = semaphore;
    }

    public void run() {
            try {
                semaphore.acquire();
                System.out.println(this.id + "is using the toilet");
                TimeUnit.MILLISECONDS.sleep(rand.nextInt(2000));
                semaphore.release();
                System.out.println(this.id + "is leaving");
            } catch (InterruptedException e) {
            }
    }
}

public class ToiletRace {
    private static final int THREAD_COUNT = 30;

    private static ExecutorService threadPool = Executors
            .newFixedThreadPool(THREAD_COUNT);

    private static Semaphore s = new Semaphore(10);

    public static void main(String[] args) {
        for (int i = 0; i < THREAD_COUNT; i++) {
            threadPool.execute(new Employee(String.valueOf(i), s));
        }

        threadPool.shutdown();
    }
}

Здесь я определил 30 человек, которые хотят в туалет, но ям всего 10. Каждый человек потребляет случайное время. Запустите приведенный выше код напрямую. Вы можете видеть, что 10 человек вошли в начале, а затем некоторые люди вошли один за другим Кто-то вышел. Но их должно быть не более 10 в использовании.

Semaphore — очень полезный инструмент параллелизма Java.Помимо приведенного выше примера, мы часто используем его в нашей работе для управления соединениями с базой данных или защиты от одновременного использования других ограниченных ресурсов. Конечно, у Semaphore есть и другие методы, вы можете проверить количество оставшихся лицензий, вы можете проверить количество потоков, использующих лицензию, и вы можете проверить официальную документацию для конкретного использования.