首页 > 其他分享 >CountDownLatch、CyclicBarrier、Semaphore面试讲解

CountDownLatch、CyclicBarrier、Semaphore面试讲解

时间:2023-10-07 15:07:46浏览次数:35  
标签:lock void Semaphore num 线程 CountDownLatch new CyclicBarrier public

@TOC

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

这三个也是面试常问的,作为线程通信的方法

1.CountDownLatch(CDL)

主要是用于一个线程等待其他完成后才继续执行。

  • 主要方法:await()、countDown()
CountDownLatch cdl = new CountDownLatch(2);

//第一个线程
new Thread(){
	public void run(){
		System.out.println("1111111");
		cdl.countDown();
	}
}.start();
//第二个线程
new Thread(){
	public void run(){
		System.out.println("22222222222221111111");
		cdl.countDown();
	}
}.start();

//主线程
cdl.await();
System0out.println("main执行!!!!!");

2.CyclicBarrier

回环栅栏:主要是用于多个线程在某个点/状态同时执行。

  • 主要方法:await()
int N = 4;
CyclicBarrier cb = new CyclicBarrier(N);
for(int i=0;i<N;i++){
	new Thread(){
		@Override
		public void run(){
			System.out.println(Thread.currentThread().getName() + "--------");
			cb.await();
			System.out.println(Thread.currentThread().getName() + "after-------");
		}
	}
}

注:其await(long timeout,TimeUnit unit)重载方法,让已到达的线程等待至一定的时间,如果还没有到达指定的数量,则这些开始执行。

3.Semaphore

信号量:主要控制访问临界资源的线程数量

  • 主要方法:acqurie()、release()
//工人数
int N = 8;
//机器或者说是资源数
Semaphore sp = new Semaphore (5);
for(int i=0;i<N;i++){
	new Thread(){
		@Override
		public void run(){
			sp.acquire();
			System.out.println("获取机器成功!!");
			sp.release();
			System.out.println("释放机器!!");
		}
	}
}

总结: 前两者主要是实现线程之间的等待,而semaphore主要是控制对资源的访问

4.生产者、消费者

开始撸代码了:

4.1 Synchronized

public class MyTest01 {


    public class Data{
        private  int num = 0;
        public synchronized void product() throws InterruptedException {
            while(num!=0){
                this.wait();
            }
            num++;
            System.out.println("生产一个!");
            this.notify();
        }
        public synchronized void consume() throws InterruptedException {
            while(num==0){
                this.wait();
            }
            num--;
            System.out.println("消费一个!");
            this.notify();
        }
    }
     @Test
    public void test(){
        final Data data = new Data();
        //final DataLock data = new DataLock();
        //生产者
        new Thread(){
            public void run(){
                for(int i = 0;i<5;i++){
                    try {
                        data.product();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
        //消费者
        new Thread(){
            public void run(){
                for(int i = 0;i<5;i++){
                    try {
                        data.consume();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();

    }
}

4.2 ReentrantLock

public class MyTest01 {


     public class DataLock{
        private  int num = 0;
        ReentrantLock lock = new ReentrantLock();
        Condition cd = lock.newCondition();
        //Condition cd2 = lock.newCondition();

        public  void product() throws InterruptedException {
            lock.lock();
            while(num!=0){
                cd.await();
            }
            num++;
            System.out.println("生产一个!");
            cd.signalAll();
            lock.unlock();
        }
        public void consume() throws InterruptedException {
            lock.lock();
            while(num==0){
                cd.await();
            }
            num--;
            System.out.println("消费一个!");
            cd.signal();
            lock.unlock();
        }
    }
    
     @Test
    public void test(){
        //final Data data = new Data();
        final DataLock data = new DataLock();
        //生产者
        new Thread(){
            public void run(){
                for(int i = 0;i<5;i++){
                    try {
                        data.product();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
        //消费者
        new Thread(){
            public void run(){
                for(int i = 0;i<5;i++){
                    try {
                        data.consume();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();

    }
}

标签:lock,void,Semaphore,num,线程,CountDownLatch,new,CyclicBarrier,public
From: https://blog.51cto.com/u_16289357/7737635

相关文章

  • 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......
  • C# 信号量 Semaphore
    ///<summary>///信号量,类似于占坑机制,初始设为5个空的坑位,且最大5个位置///</summary>staticreadonlySemaphoresemaphore=newSemaphore(5,5);staticvoidTest(){Task.Run(AAA);BBB();......
  • 【转】CountDownLatch的使用
    CountDownLatch使用原理创建CountDownLatch并设置计数器值。启动多线程并且调用CountDownLatch实例的countDown()方法。主线程调用 await() 方法,这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务,count值为0,停止阻塞,主线程继续执行。使用模板publi......
  • C# 中的锁对象SpinLock,Mutex,ReaderWriteLockSlim,SemaphoreSlim
    在C#中,有多种锁类型可用于控制并发访问和保护共享资源。以下是其中一些锁类型及其简要介绍:SpinLock:SpinLock是一种自旋锁,它在使用时会忙等待直到获取到锁为止,因此适用于低延迟应用程序。由于自旋操作可能会消耗CPU资源,因此SpinLock最适合在短时间内进行锁定和释放。M......
  • Semaphore的使用
    基本介绍多线程中上锁的目的一般是一种对受限资源的保护,例如:保证同一时刻只有一个线程能访问的ReentrantLock,或者保证只有一个线程可以写入的ReadWriteLock还有一种受限资源,它需要保证同一时刻最多有N个线程能访问,比如同一时刻最多创建100个数据库连接,最多允许10个用户下载等这种限......
  • 锁、递归锁、条件变量、信号量代码解析(Lock, RLock, Condition, Semaphore)
    锁Lock>>>help(type(threading.Lock()))Helponclasslockinmodule_thread:classlock(builtins.object)锁对象是一个同步原语。Alockobjectisasynchronizationprimitive.Tocreatealock,callthreading.Lock().Methodsare:acqui......
  • CyclicBarrier、CountDownLatch和Semaphore区别
    CyclicBarrier、CountDownLatch和Semaphore都是Java并发编程中常用的同步工具,它们在功能和使用方式上有一些区别。CyclicBarrier:CyclicBarrier用于多个线程之间互相等待,直到所有线程都到达某个屏障点后才继续执行。CyclicBarrier可以重复使用,每次到达屏障时,它的计数器会自动......
  • CyclicBarrier和CountDownLatch的区别
    引言在并发编程中,CyclicBarrier和CountDownLatch是两个常用的同步工具类。它们都可以用于线程之间的等待和协调,但在使用方式和功能上有一些区别。本文将深入探讨CyclicBarrier和CountDownLatch的区别,并给出相应的代码示例。CyclicBarrier和CountDownLatch简介CyclicBarrierCycl......