博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java面试-Java并发编程(八)——闭锁、同步屏障、信号量详解
阅读量:7098 次
发布时间:2019-06-28

本文共 1840 字,大约阅读时间需要 6 分钟。

1. 闭锁:CountDownLatch

1.1 使用场景

若有多条线程,其中一条线程需要等到其他所有线程准备完所需的资源后才能运行,这样的情况可以使用闭锁。

1.2 代码实现

// 初始化闭锁,并设置资源个数CountDownLatch latch = new CountDownLatch(2);Thread t1 = new Thread( new Runnable(){    public void run(){        // 加载资源1        加载资源的代码……        // 本资源加载完后,闭锁-1        latch.countDown();    }} ).start();Thread t2 = new Thread( new Runnable(){    public void run(){        // 加载资源2        资源加载代码……        // 本资源加载完后,闭锁-1        latch.countDown();    }} ).start();Thread t3 = new Thread( new Runnable(){    public void run(){        // 本线程必须等待所有资源加载完后才能执行        latch.await();        // 当闭锁数量为0时,await返回,执行接下来的任务        任务代码……    }} ).start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

2. 同步屏障:CyclicBarrier

2.1 使用场景

若有多条线程,他们到达屏障时将会被阻塞,只有当所有线程都到达屏障时才能打开屏障,所有线程同时执行,若有这样的需求可以使用同步屏障。此外,当屏障打开的同时还能指定执行的任务。

2.2 闭锁 与 同步屏障 的区别

  • 闭锁只会阻塞一条线程,目的是为了让该条任务线程满足条件后执行;
  • 而同步屏障会阻塞所有线程,目的是为了让所有线程同时执行(实际上并不会同时执行,而是尽量把线程启动的时间间隔降为最少)。

2.3 代码实现

// 创建同步屏障对象,并制定需要等待的线程个数 和 打开屏障时需要执行的任务CyclicBarrier barrier = new CyclicBarrier(3,new Runnable(){    public void run(){        //当所有线程准备完毕后触发此任务    }});// 启动三条线程for( int i=0; i<3; i++ ){    new Thread( new Runnable(){        public void run(){            // 等待,(每执行一次barrier.await,同步屏障数量-1,直到为0时,打开屏障)            barrier.await();            // 任务            任务代码……        }    } ).start();}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3. 信号量:Semaphore

3.1 使用场景

若有m个资源,但有n条线程(n>m),因此同一时刻只能允许m条线程访问资源,此时可以使用Semaphore控制访问该资源的线程数量。

3.2 代码实现

// 创建信号量对象,并给予3个资源Semaphore semaphore = new Semaphore(3);// 开启10条线程for ( int i=0; i<10; i++ ) {    new Thread( new Runnbale(){        public void run(){            // 获取资源,若此时资源被用光,则阻塞,直到有线程归还资源            semaphore.acquire();            // 任务代码            ……            // 释放资源            semaphore.release();        }    } ).start();}

转载地址:http://zteql.baihongyu.com/

你可能感兴趣的文章
hdu 3923 Invoker polya 定理
查看>>
文件下载--getRequestDispatcher以及文件流输出的方式
查看>>
jmeter后置处理器JSON Extractor
查看>>
旋转测试
查看>>
“省考”最热职位230人抢一个
查看>>
bzoj 4823 [Cqoi2017]老C的方块——网络流
查看>>
if else 都执行 哈哈 当然不是真的
查看>>
MySQL-----笔记3:存储引擎
查看>>
《构建之法》提问;软件和软工的来源;各种项目管理系统优缺点
查看>>
发送邮件的工具类
查看>>
在asp.net中,添加itemtempert 项模板时,如果在项模板里有其它控件,如何控件这些控件的属性?...
查看>>
微软企业库5.0 学习之路——第八步、使用Configuration Setting模块等多种方式分类管理企业库配置信息...
查看>>
网络学习笔记:TCP/IP连网和Internet
查看>>
栈实现迷宫问题
查看>>
POJ2724 Purifying Machine(二分图)
查看>>
[ISSUE]fail to forward message:TypeError: Cannot read property 'msgRemote' of undefined
查看>>
new 和 malloc 的区别 (转载)
查看>>
L2-004. 这是二叉搜索树吗?
查看>>
【操作系统】实验三 进程调度模拟程序
查看>>
LR分析法
查看>>