一个大腹便便,穿着格子衬衫的中年男子,拿着一个贴满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. Fiddler抓包过滤

    1.User Fiters启用 2.Action Action:Run Filterset now是否运行,Load Filterset加载,Save Filterset保存: 3.Hosts过滤 Z ...

  2. 如何在Ubuntu 18.04上安装Nginx

    Nginx功能之强大,想必大家比我更清楚. 百度百科:Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务.Nginx是由伊戈尔 ...

  3. vue路由中 Navigating to current location ("/router") is not allowed

    报错原因:多次点击同一路由,导致路由被多次添加 解决方法: router/index中添加以下代码: //router/index.js Vue.use(VueRouter) //导入vue路由 co ...

  4. Asp.Net Core 3.1 学习3、Web Api 中基于JWT的token验证及Swagger使用

    1.初始JWT 1.1.JWT原理 JWT(JSON Web Token)是目前最流行的跨域身份验证解决方案,他的优势就在于服务器不用存token便于分布式开发,给APP提供数据用于前后端分离的项目. ...

  5. 手机app测试用例怎么写?手机app测试点有哪些?只有干货没有水分,错过绝对后悔!

    一.前言    在当今竞争激烈的市场上一个APP的成功离不开一个可靠的测试工程师.因此,对功能和用户体验有特殊关注的App进行全面测试是必不可少的.如何做到测试用例的百分百覆盖一直是测试用例编写过程中 ...

  6. Docker 中如何安装配置 Nginx

    拉取 nginx 最新版镜像,然后简单启动一个 nginx 容器: docker pull nginx:latest docker run --name nginx01 -d -p 80:80 ngi ...

  7. 二、Go语言开发环境安装与编写第一个Hello World

    本系列文章均为学习过程中记录的笔记,欢迎和我一起来学习Go语言. 全文使用环境如下: Go语言版本:1.13 操作系统:deepin 使用工具:Goland开发工具 Go语言追溯历史 Go语言2009 ...

  8. php token验证范例

    <?php $module = $_GET['module']; $action = $_GET['action']; $token = md5sum($module.date('Y-m-d', ...

  9. $_FILES上传错误类型

    $_FILES['file']['error']其值为 0,没有错误发生,文件上传成功. 其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值. 其值 ...

  10. 【Linux网络基础】TCP/IP协议簇的详细介绍(三次握手四次断开,11种状态)

    一.TCP/IP协议簇(DoD参考模型) 用于简化OSI层次,以及相关的标准. 传输控制协议(tcp/ip)簇是相关国防部DoD所创建的,主要用来确保数据的完整性以及在毁灭性战争中维持通信 是由一组不 ...