首页 > 其他分享 >CyclicBarrier和CountDownLatch有什么区别?Semaphore(信号量)了解吗?

CyclicBarrier和CountDownLatch有什么区别?Semaphore(信号量)了解吗?

时间:2023-10-23 10:01:55浏览次数:34  
标签:10 CountDownLatch 停车场 信号量 线程 Semaphore CyclicBarrier

一、CyclicBarrier和CountDownLatch有什么区别?

两者最核心的区别:

CountDownLatch是一次性的,而CyclicBarrier则可以多次设置屏障,实现重复利用;

CountDownLatch中的各个子线程不可以等待其他线程,只能完成自己的任务;而CyclicBarrier中的各个线程可以等待其他线程

CyclicBarrier和CountDownLatch有什么区别?Semaphore(信号量)了解吗?_流量控制

二、Semaphore(信号量)

Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。

听起来似乎很抽象,现在汽车多了,开车出门在外的一个老大难问题就是停车 。停车场的车位是有限的,只能允许若干车辆停泊,如果停车场还有空位,那么显示牌显示的就是绿灯和剩余的车位,车辆就可以驶入;如果停车场没位了,那么显示牌显示的就是绿灯和数字0,车辆就得等待。如果满了的停车场有车离开,那么显示牌就又变绿,显示空车位数量,等待的车辆就能进停车场。

我们把这个例子类比一下,车辆就是线程,进入停车场就是线程在执行,离开停车场就是线程执行完毕,看见红灯就表示线程被阻塞,不能执行,Semaphore的本质就是协调多个线程对共享资源的获取。

CyclicBarrier和CountDownLatch有什么区别?Semaphore(信号量)了解吗?_数据库连接_02

我们再来看一个Semaphore的用途:它可以用于做流量控制,特别是公用资源有限的应用场景,比如数据库连接。

假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发地读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这时我们必须控制只有10个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连接。这个时候,就可以使用Semaphore来做流量控制,如下:

public class SemaphoreTest {
  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 Runnable() {
        @Override
        public void run() {
          try {
            s.acquire();
            System.out.println("save data");
            s.release();
            } catch (InterruptedException e) {
          }
        }
      });
    }
    threadPool.shutdown();
  }
}

在代码中,虽然有30个线程在执行,但是只允许10个并发执行。Semaphore的构造方法Semaphore(int permits )接受一个整型的数字,表示可用的许可证数量。

Semaphore(10) 表示允许10个线程获取许可证,也就是最大并发数是10。Semaphore的用法也很简单,首先线程使用 Semaphore的acquire()方法获取一个许可证,使用完之后调用release()方法归还许可证。还可以用tryAcquire()方法尝试获取许可证。

标签:10,CountDownLatch,停车场,信号量,线程,Semaphore,CyclicBarrier
From: https://blog.51cto.com/u_16269508/7983297

相关文章

  • Java并发工具类CountDownLatch(倒计数器)
    CountDownLatch,倒计数器,有两个常见的应用场景:场景1:协调子线程结束动作:等待所有子线程运行结束CountDownLatch允许一个或多个线程等待其他线程完成操作。例如,我们很多人喜欢玩的王者荣耀,开黑的时候,得等所有人都上线之后,才能开打。CountDownLatch模仿这个场景:创建大乔、兰陵王、安......
  • 多线程编程同步:Posix信号量
    信号量的定义IPC是进程间通信(interprocesscommunication)的简称。狭义上,IPC主要用于进程间;广义上,IPC可用于进程间或线程间。Posix消息队列、Posix信号量和Posix共享内存区合称为“PosixIPC”.信号量(semaphore)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段。......
  • linux 内核 ---信号量(semaphore)
    信号量使用说明(1)定义信号量structsemaphoresem;(2)初始化信号量voidsema_init(structsemaphore*sem,intval);该函数初始化信号量,并设置信号量sem的值为val。(3)获得信号量externvoiddown(structsemaphore*sem);externint__must_checkdown_interruptible(st......
  • 实验四 信号量
    使用二值信号量解决多线程售票系统数据错误问题实现代码#include<stdio.h>#include<pthread.h>#include<unistd.h>#include<semaphore.h>intticketAmout=2;//票的数量:全局变量sem_tmutex;//定义信号量mutexvoid*ticketAgent(void*arg){sem_wait(&mut......
  • 信号量机制和pv操作
           ......
  • POSIX信号量
    背景介绍多进程之间的同步机制:信号量。而在多线程编程中,通常更常见的是使用线程之间的同步机制,例如互斥锁、条件变量、信号量等,来实现线程之间的协调和通信。这些机制更适合用于线程级别的同步和通信需求。POSIX信号信号(signal)就是告知某一进程发生了某个事件的通知,有时也称为......
  • CountDownLatch、CyclicBarrier、Semaphore面试讲解
    @TOC<hrstyle="border:solid;width:100px;height:1px;"color=#000000size=1">这三个也是面试常问的,作为线程通信的方法1.CountDownLatch(CDL)主要是用于一个线程等待其他完成后才继续执行。主要方法:await()、countDown()CountDownLatchcdl=newCountDownLatch(2);//第一......
  • JUC工具类CountDownLatch、CyclicBarrier、Semaphore介绍
    CountDownLatch:它是一种同步工具,用于控制一个或多个线程等待其他线程完成操作后再继续执行。它的作用是让某个线程等待一组操作执行完成,再继续执行自己的任务。CountDownLatch内部有一个计数器,当计数器的值为0时,等待的线程将会被唤醒。通过CountDownLatch的构造函数可以指定计......
  • 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......
  • Linux内核信号量(semaphore)使用与源码分析
    https://blog.csdn.net/Auris/article/details/107404962一.在Linux内核驱动中使用信号量(semaphore)常规操作步骤:[0].定义信号量结构体变量;structsemaphoresem; [1].初始化信号量变量 voidsema_init(structsemaphore*sem,intn); eg.sema_ini......