首页 > 其他分享 >JUC工具类CountDownLatch、CyclicBarrier、Semaphore介绍

JUC工具类CountDownLatch、CyclicBarrier、Semaphore介绍

时间:2023-10-05 16:22:07浏览次数:35  
标签:JUC Thread 许可证 计数器 线程 Semaphore latch CountDownLatch

CountDownLatch:它是一种同步工具,用于控制一个或多个线程等待其他线程完成操作后再继续执行。它的作用是让某个线程等待一组操作执行完成,再继续执行自己的任务。CountDownLatch 内部有一个计数器,当计数器的值为0时,等待的线程将会被唤醒。通过 CountDownLatch 的构造函数可以指定计数器的初始值,并通过 countDown() 方法递减计数器的值,通过 await() 方法使线程等待计数器达到0。

 

案例(模拟一个教室,里面有五个学生一个班长,当五个学生都离开教室后班长才能锁门):

 public static void main(String[] args) {
        int numThreads = 5;
        CountDownLatch latch = new CountDownLatch(numThreads);

        // 创建并启动多个线程
        for (int i = 0; i < numThreads; i++) {
            Thread thread = new Student(latch); //通过这样的方式将latch锁放到线程里
            thread.start();
        }

        try {
            // 主线程等待所有工作线程完成
            latch.await();
            System.out.println("班长锁门");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static class Student extends Thread {
        private CountDownLatch latch;

        public Student(CountDownLatch latch) {
            this.latch = latch;
        }

        @Override
        public void run() {
            try {
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName()+"同学离开教室");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                latch.countDown();
            }
        }
    }

 

 

CyclicBarrier(循环栅栏):它也是一种同步工具,用于控制多个线程互相等待,直到所有线程都达到一个共同的屏障点,然后再一起继续执行后续操作。与 CountDownLatch 不同的是,CyclicBarrier 的计数器是可循环使用的,当计数器达到指定值时,所有等待的线程被释放,计数器会被重置。CyclicBarrier 的构造函数可以指定等待的线程数,并提供一个指定的动作(Runnable),该动作会在所有线程达到屏障点后执行。

其构造方法和使用案例类似于减少计数。

 

Semaphore(信号量):它是一种用来控制同时访问某个资源的线程数量的同步辅助类。Semaphore 内部维护了一组许可证(permit),线程在访问资源前需要先获取许可证,如果许可证数量为0,则需要等待其他线程释放许可证。当线程使用完资源后,需要释放许可证,以供其他等待线程使用。Semaphore 可以用来限制同时访问某个资源的线程数量,也可以作为一种计数器来统计通过某个点的线程数量。

 

案例:

private static final int MAX_CONCURRENT_THREADS = 5;
    private static Semaphore semaphore = new Semaphore(MAX_CONCURRENT_THREADS);

    public static void main(String[] args) {
        // 创建并启动多个访问线程
        for (int i = 0; i < 10; i++) {
            Thread thread = new WorkerThread(i);
            thread.start();
        }
    }

    static class WorkerThread extends Thread {
        private int threadIndex;

        public WorkerThread(int index) {
            this.threadIndex = index;
        }

        @Override
        public void run() {
            try {
                System.out.println("Thread " + threadIndex + " 正在等待许可证...");
              
      semaphore.acquire();

                System.out.println("Thread " + threadIndex + " 获取到许可证,开始访问资源");
                // 模拟线程访问资源的耗时操作
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
                System.out.println("Thread " + threadIndex + " 释放了许可证");
            }
        }
    }

常用方法:

获取许可证:线程可以通过调用 acquire() 方法来请求一个许可证。如果有可用的许可证,则从计数器中减去一个许可证,并继续执行。如果没有可用的许可证,线程将被阻塞,直到有许可证可用或者线程被中断。

释放许可证:线程在使用完资源后,需要调用 release() 方法来释放许可证。该操作将会将计数器中的许可证数量加一,如果有其他线程在等待许可证,其中一个线程将会被唤醒并获取到许可证。

标签:JUC,Thread,许可证,计数器,线程,Semaphore,latch,CountDownLatch
From: https://www.cnblogs.com/xialang/p/17743482.html

相关文章

  • 一点点JUC的小姿势
    1JUCJUC就是java.util.concurrent下面的类包,专门用于多线程的开发。1.1并发与并行并发多线程操作同一个资源。CPU只有一核,模拟出来多条线程,天下武功,唯快不破。那么我们就可以使用CPU快速交替,来模拟多线程。并发编程的本质:充分利用CPU的资源!并行并行:多个人一起行......
  • JUC并发编程---Lock锁
    文章目录什么是Locksynchronized加锁和Lock加锁代码示例synchronized使用Lock加锁公平锁和非公平锁公平锁:非公平锁:Lock和Synchronized的区别synchronized版的生产者和消费者Lock版的生产者和消费者生产者和消费者出现的问题Condition精准通知和唤醒线程什么是Lock官网介绍:虽然......
  • JUC-2
    JUC-26、集合类不安全listpackagedemo02;importjava.util.*;importjava.util.concurrent.CopyOnWriteArrayList;//.ConcurrentModificationException并发修改异常publicclassDay92300{publicstaticvoidmain(String[]args){/*并发下Ar......
  • semaphore互斥失败导致出core
    先看堆栈(gdb)bt#0bnet_neigh_event_thread(dummy=dummy@entry=0x0)at/vob/jenkins/workspace/_build_8.8.3/sdk/src/customer_smm/l3.c:1303#10x0000000002172cb0inthread_boot(ti_void=0x1c99dc10)at/vob_yukon/xzhou_streams/smm_88x/sdk/src/sal/core/unix......
  • JUC-1
    JUC-11、什么是JUC源码+官方文档面试高频问!java.util工具包、包、分类业务∶普通的线程代码ThreadRunnable没有返回值、效率相比入Callable相对较低!2、线程和进程线程、进程,如果不能使用一句话说出来的技术,不扎实!进程:—个程序,QQ.exeMusic.exe程序的集合;一个进程往......
  • Linux内核信号量(semaphore)使用与源码分析
    https://blog.csdn.net/Auris/article/details/107404962一.在Linux内核驱动中使用信号量(semaphore)常规操作步骤:[0].定义信号量结构体变量;structsemaphoresem; [1].初始化信号量变量 voidsema_init(structsemaphore*sem,intn); eg.sema_ini......
  • 全网最详细Java-JUC
    Java-JUC⓪基础❶进程&线程进程:指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间。线程:比进程更小的执行单位,一个进程可以启动多个线程,每条线程并行执行不同的任务。❷并行&并发并行(Parallel):在同一时刻,有多个指令在多个CPU上同时执行。并发(Concurrent):在......
  • 25届实习秋招-Java面试-JUC多线程面试题整理-牛客网
    JUC介绍一下JUC下的锁(如何使用及应用场景)线程什么是进程:特征什么是线程:资源为什么多线程,什么使用用单线程,什么时候多线程,什么条件下多线程快。进程和线程的对比:进程如何通信,每种通信存放的介质。||线程的通信,几种方式。join进程和线程的区别,在JVM层面的体现一......
  • Java多线程____JUC并发锁机制
    1.同步锁即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁。同步锁的原理是,对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁但是,在同一个时间点,该同步锁能且只能被一个线程获取到。这样,获取到同步锁的线程就能进行CPU调度,从而在CPU上执行;而没有获......
  • JUC并发编程
    JUC并发编程1.什么是JUCjava.util工具包,包,分类业务:普通的线程代码ThreadRunable没有返回值,效率相比Callable相对较低!2.线程和进程线程、进程、如果不能使用一句话说出来的技术,不扎实!进程:一个程序,例如qq.exe,代表一个程序的集合一个进程往往包含多个线程,而一个进......