一个大腹便便,穿着格子衬衫的中年男子,拿着一个贴满Logo的Mac向我走来,看着稀少的头发,我心想着肯定是顶级技术大牛吧!但是我也是一个才华横溢的人,稳住我们能赢。

面试官:您好,先做一下自我介绍吧!

:您好,我是亚瑟,王者背负,王者审判,王者不可阻挡!

面试官:用什么铭文?怎么出装吗?

:咳咳咳,不好意思,说错了。我是万猫,一直在做Java的后端开发。

面试官:咳咳咳,看你简历上写熟悉并发编程,CyclicBarrier用过的吧?

:有用过。(还好提前有准备!)

面试官:它的主要作用是什么?

:CyclicBarrier是一种同步辅助工具,字面意思就是循环栅栏,它允许一组线程在一个共同的屏障点彼此等待,所有线程到达屏障点后再全部同时执行。固定数量的线程在程序中必须彼此等待的时候,CyclicBarrier非常有用。

面试官:为什么叫循环栅栏?循环是什么含义?

:循环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。

面试官:可以举一个重用的例子吗?

:比如张三、李四和王五三个人约好去饭店一起去吃饭,等到所有人到了饭店以后再一起吃饭,然后等到所有人都吃完以后再一起离开餐厅。这两次等待就可以重用。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

面试官:可以写一下吗?

:当然可以,这是人物的类:

package onemore.study;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.CyclicBarrier; public class Person implements Runnable {
private CyclicBarrier barrier;
private String name; public Person(CyclicBarrier barrier, String name) {
this.barrier = barrier;
this.name = name;
} @Override
public void run() {
try {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
Random random = new Random(); System.out.println(sdf.format(new Date()) + " " + name + "出发去饭店");
Thread.sleep((long)(random.nextDouble() * 3000) + 1000);
System.out.println(sdf.format(new Date()) + " " + name + "到了饭店"); barrier.await(); System.out.println(sdf.format(new Date()) + " " + name + "开始吃饭");
Thread.sleep((long)(random.nextDouble() * 3000) + 1000);
System.out.println(sdf.format(new Date()) + " " + name + "吃完了"); //重用CyclicBarrier
barrier.await(); System.out.println(sdf.format(new Date()) + " " + name + "离开餐厅"); } catch (Exception e) {
e.printStackTrace();
}
}
}

然后这是测试类:

package onemore.study;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CyclicBarrier; public class CyclicBarrierTester {
public static void main(String[] args) throws InterruptedException {
CyclicBarrier barrier = new CyclicBarrier(3); List<Thread> threads = new ArrayList<>(3);
threads.add(new Thread(new Person(barrier, "张三")));
threads.add(new Thread(new Person(barrier, "李四")));
threads.add(new Thread(new Person(barrier, "王五"))); for (Thread thread : threads) {
thread.start();
} //等待所有线程跑完
for (Thread thread : threads) {
thread.join();
}
}
}

运行以后的结果应该是这样的:

07:15:58.856 张三出发去饭店
07:15:58.856 王五出发去饭店
07:15:58.856 李四出发去饭店
07:16:01.237 李四到了饭店
07:16:02.039 王五到了饭店
07:16:02.600 张三到了饭店
07:16:02.600 张三开始吃饭
07:16:02.600 李四开始吃饭
07:16:02.600 王五开始吃饭
07:16:04.620 张三吃完了
07:16:05.046 王五吃完了
07:16:05.145 李四吃完了
07:16:05.145 李四离开餐厅
07:16:05.145 张三离开餐厅
07:16:05.145 王五离开餐厅

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

面试官:有没有看过CyclicBarrier的源码?

:看过JDK8的一些源码。

面试官:那说说CyclicBarrier被障碍的原理。

:在CyclicBarrier的内部定义了一个ReentrantLock的对象,然后再利用这个ReentrantLock对象生成一个Condition的对象。每当一个线程调用CyclicBarrier的await方法时,首先把剩余屏障的线程数减1,然后判断剩余屏障数是否为0:如果不是,利用Condition的await方法阻塞当前线程;如果是,首先利用Condition的signalAll方法唤醒所有线程,最后重新生成Generation对象以实现屏障的循环使用。

面试官:嗯,我这里没有要问的了。你稍等一会,我去叫下一个面试官。

微信公众号:万猫学社

微信扫描二维码

获得更多Java技术干货

阿里面试居然跟我扯了半小时的CyclicBarrier的更多相关文章

  1. 腾讯面试居然跟我扯了半小时的CountDownLatch

    一个长头发.穿着清爽的小姐姐,拿着一个崭新的Mac笔记本向我走来,看着来势汹汹,我心想着肯定是技术大佬吧!但是我也是一个才华横溢的人,稳住我们能赢. 面试官:看你简历上有写熟悉并发编程,CountDo ...

  2. 头条面试居然跟我扯了半小时的Semaphore

    一个长头发.穿着清爽的小姐姐,拿着一个崭新的Mac笔记本向我走来,看着来势汹汹,我心想着肯定是技术大佬吧!但是我也是一个才华横溢的人,稳住我们能赢. 面试官:看你简历上有写熟悉并发编程,Semapho ...

  3. 学生党如何拿到阿里技术offer:《阿里面试经历-2014.4.18研发实习生面试经历(失败)》

    我们分享的上一篇文章是一位学长在大三的时候面试阿里实习生成功的经历的分享,其实就像学长在上一篇文章最后说的那样“面试并没有想的那么难,运气也会占一部分.”,其实我个人觉得,对于我们而言,自己越努力就会 ...

  4. 阿里面试回来,想和Java程序员谈一谈(转载)

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

  5. 阿里面试回来,想和Java程序员谈一谈

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

  6. 一名十年Java程序员回忆阿里面试经历——揭开阿里面试的“遮羞布”

    阿里面试经历 去阿里面试可以说非常非常的偶然和戏剧性,因为本人根本没投简历,以至于阿里hr给我电话的时候我一度认为是诈骗电话.因为深圳这家公司不错我还想在这里干个两年左右再考虑考虑. 这个时候的本人已 ...

  7. 跟面试官侃半小时MySQL事务隔离性,从基本概念深入到实现

    提到MySQL的事务,我相信对MySQL有了解的同学都能聊上几句,无论是面试求职,还是日常开发,MySQL的事务都跟我们息息相关. 而事务的ACID(即原子性Atomicity.一致性Consiste ...

  8. iOS技能 - 最新美团、百度、腾讯、头条、阿里 面试题目记录

    关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教.主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧. 美团 一面 1.简历上写的项目问了一遍,然 ...

  9. 一个HashMap能跟面试官扯上半个小时

    一个HashMap能跟面试官扯上半个小时 <安琪拉与面试官二三事>系列文章 一个HashMap能跟面试官扯上半个小时 一个synchronized跟面试官扯了半个小时 一个volatile ...

随机推荐

  1. 14. 最长公共前缀----LeetCode

    编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","flow" ...

  2. shiro:集成Spring(四)

    基于[加密及密码比对器(三)]项目改造 引入相关依赖环境 shiro-spring已经包含 shiro-core和shiro-web 所以这两个依赖可以删掉 <!--shiro继承spring依 ...

  3. Springboot:JSR303数据校验(五)

    @Validated //开启JSR303数据校验注解 校验规则如下: [一]空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @No ...

  4. prefetch 和 preload 及 webpack 的相关处理

    使用预取和预加载是网站性能和用户体验提升的一个很好的途径,本文介绍了使用 prefetch 和 prefetch 进行预取和预加载的方法,并使用 webpack 进行实现 Link 的链接类型 < ...

  5. 科学计算包Numpy

    Numpy 用于科学计算的python模块,提供了Python中没有的数组对象,支持N维数组运算.处理大型矩阵.成熟的广播函数库.矢量运算.线性代数.傅里叶变换以及随机数生成等功能,并可与C++.FO ...

  6. [http 1.1] M-POST w3

    5. Mandatory HTTP Requests An HTTP request is called a mandatory request if it includes at least one ...

  7. HTML JavaScript 基础(上)

    一.初识JavaScript JavaScript 和 Java什么关系? 半毛线关系都没有,只是名字有点重合而已. JavaScript 和python.C#.Java.Ruby一样,都是一门独立的 ...

  8. values/colors.xml

    <color name="abcd">#FFC4C4C4</color> <color name="white">#FFFF ...

  9. nodejs操作MySQL,mysql连接池及事务的使用

    https://blog.csdn.net/jasnet_u/article/details/88605168

  10. 数据库SQL语言从入门到精通--Part 5--E-R图(实体联系图)用来描述数据库图例

    数据库从入门到精通合集(超详细,学习数据库必看) E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型. ...