В Java синхронизированное ключевое слово и блокировка блокировки используются для реализации одновременного управления доступа ресурсов. Только уникальные потоки могут ввести критическую область для доступа к ресурсам (кроме блокировки чтения). Основная цель этого подзаконтроля-решить проблему несоответствия данных, вызванной несколькими потоками одновременно с одним и тем же ресурсом. В другом сценарии ресурс имеет несколько копий для использования одновременно, например, несколько принтеров в комнате для принтера, и несколько ям для использования одновременно. В этом случае Java обеспечивает еще одно параллельное управление доступом - параллельный контроль доступа для нескольких копий ресурса, и Semaphore, используемый сегодня, является одним из них.
Java может определять потенциальные проблемы безопасности потока в нашей системе самым быстрым способом с моделированием кода. Здесь Semaphore (Semaphore) и Countdownlatch (блокировка) используются с Executorservice (пул потоков) для моделирования. Основное введение заключается в следующем:
1. Семфор
Этот класс будет предоставлен после JDK 1.5
Semaphore-это семафор на основе подсчета. Он может установить порог, основываясь на этом, несколько потоков конкурируют, чтобы получить сигнал лицензии и вернуть его после подачи собственного приложения. После превышения порога приложение потока для лицензионного сигнала будет заблокировано. Семфор может использоваться для создания некоторых пулов объектов, пулов ресурсов и т. Д., Такие, как пулы соединений с базой данных. Мы также можем создать семафор с подсчетом 1, используя его в качестве механизма, аналогичного замкам Mutex. Это также называется бинарным семафором, указывающим на два состояния мутекс.
2. Countdownlatch
Этот класс будет предоставлен после JDK 1.5.
Класс CountDownLatch может заставить поток ждать, пока другие потоки завершит свою соответствующую работу перед выполнением. Например, основной поток приложения хочет выполнить после того, как поток, ответственный за начало службы Framework, запустила все платформу.
Countdownlatch реализуется через счетчик, а начальное значение счетчика - это количество потоков. Всякий раз, когда поток выполняет свою собственную задачу, значение счетчика уменьшается на 1. Когда значение счетчика достигает 0, это означает, что все потоки выполнили задачу, а затем потоки, ожидающие блокировки, могут возобновить выполнение задачи.
Как показано на рисунке ниже:
Вышеупомянутые два класса могут использоваться в комбинации для достижения эффекта моделирования высокой параллелистики. Следующий код используется для примера:
пакетные модули; import java.util.concurrent.countdownlatch; import java.util.concurrent.executorservice; import java.util.concurrent.executors; импорт java.util.concurrent.semaphore; public class -countxample {// общее количество запросов общедоступного int clientTotal = 5000; // количество потоков, выполняемых одновременно в то же время, public static int Threadtotal = 200; Public Static Int Count = 0; public static void main (string [] args) бросает исключение {rececusterservice executorservice = experators.newcachedthreadpool (); // полупроводник, используемый для управления количеством одновременных потоков здесь окончательный семафор Semaphore = новый семафор (Threadtotal); // блокировка, которая может реализовать уменьшение счетчика окончательного обратного отсчета для (int i = 0; i <clientTotal; i ++) {rececusterservice.execute (() -> {try {// выполнить этот метод для получения разрешения на выполнение. Когда общее количество не выпущенных лицензий не превышает 200, // разрешить проход, в противном случае поток и ожидание до получения лицензии. Catch (Exception e) {//log.error("exception ", e); } countdownlatch.await (); // блоки потоков, и блок не будет выпущен до тех пор, пока значение блокировки не будет 0. Продолжить выполнять executorservice.shutdown (); log.info ("count: {}", count); } private static void add () {count ++; }}Как показано в приведенном выше методе, моделируются 5000 запросов, а 200 одновременных операций - до 200 одновременных операций. Наблюдайте за окончательными результатами и обнаружите, что результаты различны для каждого раз и не соответствуют ожиданиям. Результат заключается в следующем:
22: 18: 26.449 [Main] Info Modules.countexample - Count: 4997
22: 18: 26.449 [Main] Info Modules.countexample - Count: 5000
22: 18: 26.449 [Main] Info Modules.countexample - Count: 4995
22: 18: 26.449 [Main] Info Modules.countexample - Count: 4998
Окончательный вывод: метод добавления не является потоковым безопасным
Затем, как обеспечить безопасность потока метода добавления, измените метод добавления следующим образом:
private static void add () {count.incrementAndget ();}Результаты выполнения следующие:
22: 18: 26.449 [Main] Info Modules.countexample - Count: 5000
22: 18: 26.449 [Main] Info Modules.countexample - Count: 5000
22: 18: 26.449 [Main] Info Modules.countexample - Count: 5000
22: 18: 26.449 [Main] Info Modules.countexample - Count: 5000
22: 18: 26.449 [Main] Info Modules.countexample - Count: 5000
22: 18: 26.449 [Main] Info Modules.countexample - Count: 5000
22: 18: 26.449 [Main] Info Modules.countexample - Count: 5000
22: 18: 26.449 [Main] Info Modules.countexample - Count: 5000
Окончательный вывод: модифицированный метод Add Method-Rease.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.