JAVA面经复习(十七)

面试难度:<mark>☆☆☆</mark>

问:介绍一下java集合

答:java集合主要是set,map还有list。
如下图所示:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
├HashSet
└TreesSet
Map
├Hashtable
├HashMap
└TreeMap

问:hashmap原理

答:hashmap采用哈希函数散列来保存对应的数值。
put方法,第一步首先将k,v封装到Node对象当中(节点)。第二步它的底层会调用K的hashCode()方法得出hash值。第三步通过哈希表函数/哈希算法,将hash值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。
get方法,第一步:先调用k的hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。第二步:通过上一步哈希算法转换成数组的下标之后,在通过数组下标快速定位到某个位置上。
底层数据结构:采用数组+链表/红黑树的方式。

问:代码写死锁, 我用的两个object,两层synchronized代码块实现的,不知道对不对呢?

答:。。。题意不明。。。

问:synchronize?

答:synchronize,是java中常用的加锁的关键字,其采用的是悲观锁的思想,使得当前资源仅能够被一个线程访问。(jdk1.8后对synchronize进行了改进,主要是采用锁升级的方式,依次从无锁-偏向锁-轻量锁(CAS)-重量锁(同原syn),同时还采用了一些锁粗化,锁消除等机制优化syn的性能。)

问:volatile?

答:该关键字主要用于线程间共享变量,同时其采用内存屏障的方式保存代码执行的有序性。但volatile无法保持代码的原子性,因此也就是线程不安全的。

问:AtomicInteger

答:AtomicInteger是针对高并发下采用的原子类。jdk1.8底层采用unsafe类的CAS锁对数据进行操作,从而确保了高并发下的线程安全。

问:CAS

答:全称CompareAndSwap。是一种常用的乐观锁,其方式是采用对内存中的数据进行一次查询,然后同自己持有的volatile变量进行比较是否相同,如果相同,那就表明没有人在访问临界资源,否则是有人在使用资源,就进入自旋状态。(拓展:CAS的常见问题是ABA问题和自旋消耗过多的CPU资源。ABA问题就采用版本号的方式解决。)

问:最后问我会不会线程池?

答:线程池简单理解就是帮我们管理线程的池子,其避免增加创建线程和销毁线程的资源损耗。因为线程其实也是一个对象,创建一个对象,需要经过类加载过程,销毁一个对象,需要走GC垃圾回收流程,都是需要资源开销的。线程池可以通过ThreadPoolExecutor来创建

问:然后接着问如果消息队列产生的信息过多,消费者无法及时消费,需要怎么解决呢?

答:这将生产者进行阻塞呗,采用wait()方法。

再挂一个快手一面