面试官:平时在工作中会用到什么样的集合?Hydra:用过ArrayList,HashMap,呃……没有面试官:好吧,回家等通知吧……不知道大家有没有面试过这种经历?当你被问到你只在工作中使用过的几个简单的集合时,你会感到紧张。在面试中,如果你能解释一些有特殊使用场景的采集工具的原理,面试官就会头皮发麻。于是九头蛇苦读了半个月,又来见面试官了。面试官:又来了,兄弟,让我看看你这半个月的学习情况Hydra:我们先从ArrayBlockingQueue说起,它是一个线程安全和阻塞有界队列面试官:好的,我来说说它的线程安全Hydra:的ArrayBlockingQueue的线程安全是由底层的ReentrantLock来保证的,所以当元素进出队列时,不需要额外加锁。写一段简单的代码作为例子,从具体的使用来说明它的线程安全。ArrayBlockingQueuequeue=newArrayBlockingQueue(7,true,newArrayList<>(Arrays.4,5,6,7})));@AllArgsConstructorclassTaskimplementsRunnable{StringthreadName;@Overridepublicvoidrun(){while(true){try{System.out.println(threadName+"take:"+queue.take());}catch(InterruptedExceptione){e.printStackTrace();}}}}privatevoidqueueTest(){newThread(newTask("Thread1")).start();newThread(newTask("Thread2")).start();}在代码中创建队列时,将7个元素放入其中,然后创建两个线程从队列中取出元素。对队列的操作也很简单,只使用操作队列中的takeout方法,运行结果如下:Thread1take:1Thread2take:2Thread1take:3Thread2take:4Thread1take:5Thread2take:6Thread1take:7你可以在fair中看到模式下,两个线程交替对队列中的元素执行dequeue操作,不会出现重复取出的情况,即保证了多个线程对资源竞争的互斥访问。它的流程是这样的:采访者:它的阻塞呢?Hydra:好的,我们写一段代码来说明一下privatestaticvoidqueueTest()throwsInterruptedException{ArrayBlockingQueuequeue=newArrayBlockingQueue<>(3);intsize=7;ThreadputThread=newThread(()->{for(inti=0;i{for(inti=0;i