是被捞起来的,今年秋招的第一场大厂面试,非常万幸没有手撕代码,但是表现得还是不好,主要是基础知识看的还是不够深入。
首先问了实际java学习时间。 如实回答只有最近几个月。
问了简历上小项目花费的时间。如实回答因为项目简单,主要是为了学习用的,实际只用了两周(实际上就用了一周)
然后就问多线程的知识。
java里有哪些保证多线程安全的方法。我回答的锁的机制,比如synchorinzed,reetranlock,还有threadlocal这些关键字。问synchorinzed,reetranlock区别,答一个是基于操作系统实现的,一个是jvm层次的,synchorinzed只能是非公平锁,reetranlock可以非公平可以公平,还有reetranlock需要手动释放锁,synchorinzed可以自动释放。还有synchorinzed没升级之前是重量级锁,会比lock更费时耗资源。
问lock底层怎么实现的 没答上 提示了一下 答上是AQS,也没答出来更多
问synchorinzed底层原理 答了
synchorinzed在java自己有的类里面哪里用到过 说了hashtable还有synchorinzedhashmap
乐观锁和悲观锁 怎么实现的 只会答了乐观锁的概念 然后CAS是一般实现乐观锁的方式
reetranlock平时都叫什么(没底气的说了可重入锁 竟然还想改口说是读写锁 唉)然后问可重入锁的概念 举了一个递归的例子 又问了非递归的情况下呢 比如说先上锁 后面解锁 上锁次数大于解锁次数这个线程能否锁住这个资源 这里应该回答错了
问CAS全称 忘了 讲了CAS的基本原理
线程池方面的知识 说了一下线程池类型 线程池基本参数和原理 考了一下给出各个参数(核心线程数3 最大线程数5 超时时间1秒 阻塞队列10个 使用默认的抛出策略) 让我说从1个线程到10个线程线程池处理的整个流程
了解不了解怎么指定这些参数时候有什么原则 这个也不知道 我就说核心线程数一般是cpu核数+1 然后其他的参数需要考虑一下各个任务占用时间长短 然后他又问那核心线程数这个数字也是什么情况都不变的吗 回答要考虑任务是需要占CPU时间片多的任务还是IO多的任务 如果占用CPU时间片少也可以把核心线程数增大
怎么定位多线程的异常 知不知道有哪些类和方法
ThreadLocal是怎么保证线程安全的 回答了一下概念和底层原理
JUC包中都了解哪些函数和类,比如CountDownLatch、 Semaphore、CyclicBarrier这些都了解吗。就只答了countDownLatch和应用场景,还有信号量,对其他的不了解。
Future对于结果的获取,不是很友好,只能通过阻塞或者轮询的方式得到任务的结果。
- Future.get() 就是阻塞调用,在线程获取结果之前get方法会一直阻塞。
- Future提供了一个isDone方法,可以在程序中轮询这个方法查询执行结果。
阻塞的方式和异步编程的设计理念相违背,而轮询的方式会耗费无谓的CPU资源。因此,JDK8设计出CompletableFuture。CompletableFuture提供了一种观察者模式类似的机制,可以让任务执行完成后通知监听的一方。另外completableFuture提供了各个异步任务之间的链式调用。