当前位置: 首页 > 后端技术 > Java

阿里采访了我半个小时关于CyclicBarrier

时间:2023-04-01 15:25:18 Java

,一个大肚子穿着格子衬衫的中年男人,拿着一个满是logo的Mac向我走来,看着稀疏的头发,我想一定是Top科技巨头!不过我也是个人才,坚持下去就能赢。面试官:你好,先自我介绍一下!我:你好,我是亚瑟,熊王,审判王,势不可挡的王者!采访者:用什么铭文?怎么穿?我:咳咳,对不起,我弄错了。我是万猫,一直在做Java后端开发。面试官:咳咳咳,简历上写着你熟悉并发编程,你用过CyclicBarrier吗?我:它起作用了。(提前准备好!)面试官:它的主要作用是什么?我:CyclicBarrier是一个同步辅助工具,字面意思是一个圆形的栅栏,让一组线程在一个共同的屏障点相互等待,所有线程到达屏障点后同时执行。当固定数量的线程必须在程序中相互等待时,CyclicBarriers很有用。采访者:为什么叫环形围栏?循环是什么意思?我:CyclicBarrier可以在所有等待的线程都被释放的情况下重用。面试官:你能举个重用的例子吗?我:比如张三、李四、王舞约好一起去饭店吃饭,大家到饭店后再一起吃饭,大家吃完再一起离开饭店。这两个等待可以重复使用。面试官:你能写下来吗?我:当然是person类:packageonemore.study;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Random;importjava.util.concurrent.CyclicBarrier;publicclassPersonimplementsRunnable{私有CyclicBarrier屏障;私有字符串名称;publicPerson(CyclicBarrierbarrier,Stringname){this.barrier=barrier;this.name=名称;}@Overridepublicvoidrun(){try{SimpleDateFormatsdf=newSimpleDateFormat("HH:mm:ss.SSS");随机random=newRandom();System.out.println(sdf.format(newDate())+""+name+"出发去酒店");Thread.sleep((long)(random.nextDouble()*3000)+1000);System.out.println(sdf.format(newDate())+""+name+"到餐厅");barrier.await();System.out.println(sdf.format(newDate())+""+name+"开始吃");苏黎世ad.sleep((long)(random.nextDouble()*3000)+1000);System.out.println(sdf.format(newDate())+""+name+"finished");//重用CyclicBarrierbarrier.await();System.out.println(sdf.format(newDate())+""+name+"离开餐厅");}catch(Exceptione){e.printStackTrace();然后这里是测试类:args)throwsInterruptedException{CyclicBarrierbarrier=newCyclicBarrier(3);列表<线程>threads=newArrayList<>(3);threads.add(newThread(newPerson(barrier,"张三")));threads.add(newThread(newPerson(barrier,"李四")));threads.add(newThread(newPerson(barrier,"王舞")));对于(线程线程:th读取){thread.start();}//等待所有线程完成运行for(Threadthread: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王舞离开餐厅面试官:你看过CyclicBarrier的源码吗?我:看过一些JDK8的源码面试官:再说说CyclicBarrier被阻塞的原理。我:在CyclicBarrier里面定义一个ReentrantLock对象,然后用这个ReentrantLock对象生成一个Condition对象。每当线程调用CyclicBarrier的await方法时,先将剩余barrier线程数减1,然后判断剩余barrier数是否为0:如果不是,则使用Condition的await方法阻塞当前线程;如果是,首先使用Condition的signalAll方法唤醒所有线程,最后重新生成Generation对象,实现barrier的循环使用。面试官:嗯,我这里没什么好问的。你稍等,我叫下一个面试官。