阿里面试居然跟我扯了半小时的CyclicBarrier
一个大腹便便,穿着格子衬衫的中年男子,拿着一个贴满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的更多相关文章
- 腾讯面试居然跟我扯了半小时的CountDownLatch
一个长头发.穿着清爽的小姐姐,拿着一个崭新的Mac笔记本向我走来,看着来势汹汹,我心想着肯定是技术大佬吧!但是我也是一个才华横溢的人,稳住我们能赢. 面试官:看你简历上有写熟悉并发编程,CountDo ...
- 头条面试居然跟我扯了半小时的Semaphore
一个长头发.穿着清爽的小姐姐,拿着一个崭新的Mac笔记本向我走来,看着来势汹汹,我心想着肯定是技术大佬吧!但是我也是一个才华横溢的人,稳住我们能赢. 面试官:看你简历上有写熟悉并发编程,Semapho ...
- 学生党如何拿到阿里技术offer:《阿里面试经历-2014.4.18研发实习生面试经历(失败)》
我们分享的上一篇文章是一位学长在大三的时候面试阿里实习生成功的经历的分享,其实就像学长在上一篇文章最后说的那样“面试并没有想的那么难,运气也会占一部分.”,其实我个人觉得,对于我们而言,自己越努力就会 ...
- 阿里面试回来,想和Java程序员谈一谈(转载)
引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...
- 阿里面试回来,想和Java程序员谈一谈
引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...
- 一名十年Java程序员回忆阿里面试经历——揭开阿里面试的“遮羞布”
阿里面试经历 去阿里面试可以说非常非常的偶然和戏剧性,因为本人根本没投简历,以至于阿里hr给我电话的时候我一度认为是诈骗电话.因为深圳这家公司不错我还想在这里干个两年左右再考虑考虑. 这个时候的本人已 ...
- 跟面试官侃半小时MySQL事务隔离性,从基本概念深入到实现
提到MySQL的事务,我相信对MySQL有了解的同学都能聊上几句,无论是面试求职,还是日常开发,MySQL的事务都跟我们息息相关. 而事务的ACID(即原子性Atomicity.一致性Consiste ...
- iOS技能 - 最新美团、百度、腾讯、头条、阿里 面试题目记录
关于面试题,可能没那么多时间来总结答案,有什么需要讨论的地方欢迎大家指教.主要记录一下准备过程,和面试的一些总结,希望能帮助到正在面试或者将要面试的同学吧. 美团 一面 1.简历上写的项目问了一遍,然 ...
- 一个HashMap能跟面试官扯上半个小时
一个HashMap能跟面试官扯上半个小时 <安琪拉与面试官二三事>系列文章 一个HashMap能跟面试官扯上半个小时 一个synchronized跟面试官扯了半个小时 一个volatile ...
随机推荐
- C - Long Beautiful Integer codeforces 1269C 构造
题解: 这里的m一定是等于n的,n为数最大为n个9,这n个9一定满足条件,根据题目意思,前k个一定是和原序列前k个相等,因此如果说我们构造出来的大于等于原序列,直接输出就可以了,否则,由于后m-k个一 ...
- 如何将SqlServer配置为django的数据源(2.2以后版本)
django-pyodbc-azure 是一个官方推荐的 第三方django数据库支持backend. 根据官网的介绍django-pyodbc-azure 只能支持到 django 2.1.如果涉及 ...
- Mysql链接查询
连接查询--交叉连接将两张表的数据与另外一张表彼此交叉原理:1. 从第一张表一次取出每一条记录2. 取出每一条记录之后,与另外一张表的全部记录挨个匹配3. 没有任何匹配条件,所有的结果都会进行保留4. ...
- 关于JavaEE中Spring模块的学习!
七大模块,如下: 1. Spring Core: Core封装包是框架的最基础部分,提供IOC和依赖注入特性.这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性 ...
- 前端基础进阶(七)-前端工程师最容易出错的问题-this关键字
我们在学习JavaScript的时候,因为对一些概念不是很清楚,但是又会通过一些简洁的方式把它给记下来,那么这样自己记下来的概念和真正的概念产生了很强的偏差. 当然,还有一些以为这个是对的,还会把它发 ...
- Python网络爬虫:伪装浏览器
一.添加超时跳过功能 首先, 我简单地将 urlop = urllib.request.urlopen(url) 改为 urlop = urllib.request.urlopen(url, time ...
- 5. 配置项:rule_files
prometheus配置文件内容: global: # 默认情况下抓取目标的频率. [ scrape_interval: <duration> | default = 1m ] # 抓取超 ...
- thinkphp5.1+ 使用 Redis 缓存
修改 config/cache.php 将其配置成多个缓存类型,示例 <?php // +---------------------------------------------------- ...
- TVP专家眼中的云开发:定是未来,尚不完美
TVP专家眼中的云开发:定是未来,尚不完美 C++之父 Bjarne曾说,"世界上只有两种编程语言,一种被人骂,一种没人用".这句玩笑话道出了软件开发行业的真谛,不怕被人吐槽,就怕 ...
- Display a QMessageBox from a QThread
Emit a signal. Since you cannot do UI stuff in a Qthread, instead send your message as an argument o ...