基本功
1,HTTP 请求的 GET 与 POST 方式的区别: Post 的数据大多都在 body 里面, post 比 get 多一次 header 请求
2,equals 与 == 的区别: equals 是逻辑等,== 是对象地址
线程:
1,Arraylist 与 LinkedList 区别: arraylist 底层数组 (读取效率高),linked 底层链表 (更新效率高)
2,ArrayList 与 Vector 区别: vetctor 线程安全, synchronize
3,HashMap 和 Hashtable 的区别: hashtable 线程安全 (synchronize),key value 皆不能为空
4,HashMap 和 ConcurrentHashMap 的区别: ConcurrentHashMap 线程安全 (1.8 为 synchronize,1.7 及之前为 segment AQS)
5,HashMap 的工作原理及代码实现: 数组 + 链表 (1.8 新增红黑树), 扩容为当前容量一倍 (arraylist 为当前的一半)
6,ConcurrentHashMap 的工作原理及代码实现: 同 hashmap,1.8 为 synchronize,1.7 及之前为 segment AQS
线程
1, 创建线程的方式及实现: Thread,Runnable,Callable(FutureTask)
2,sleep() ,join(),yield() 有什么区别: sleep 出让 CPU, 不释放锁 | wait 出让 cpu, 释放锁 | yield 出让 cpu, 不释放锁 | join, 让当前线程等待调用 join 的线程
3, 说说 CountDownLatch 原理: AQS 中, state 为 count
4, 说说 CyclicBarrier 原理:
5, 说说 Semaphore 原理:
6, 说说 Exchanger 原理
7, 说说 CountDownLatch 与 CyclicBarrier 区别
8,ThreadLocal 原理分析: Thread 有个 map 属性, key 为 ThreadLocal 类的变量, value 为范型值, 每次 get 都是去查 map
9, 讲讲线程池的实现原理: poolSize <corePoolSize, 新建线程 | poolSize> corePoolSize, 队列未满, 放队列 | poolSize> corePoolSize, 队列已满, poolSize <maximumPoolSize, 新增线程 | poolSize> corePoolSize, 队列已满, poolSize = maximumPoolSize, 则拒绝 | 线程执行完任务后, 不立即退出, 而是检查队列还有没有任务, 没有则会退出超出 corePoolSize 的线程
10, 线程池的几种方式: newCachedThreadPool|newFixedThreadPool|newSingleThreadExecutor|newScheduleThreadPool|new ThreadPooledExecutor()
11, 线程的生命周期
锁机制
1, 说说线程安全问题:
2,volatile 实现原理: 内存屏障, 禁止重排序
3,synchronize 实现原理: monitorenter,monitorexit(底层为对象头中记录了线程标识)
4,synchronized 与 lock 的区别: synchronized 是 jvm 实现的, 悲观锁, lock 是 jdk 的 AQS 实现的, 乐观锁
5,CAS 乐观锁: 乐观去操作, 失败则可以采用自旋重试 (底层实现为 MESI 协议)
6,ABA 问题: N 线程读取变量为 A,M 线程 A-->B, 然后又 B-->A,N 线程再读取的时候还是 A, 认为变量没有变化, 可以采用 AtomicStampedReference 来解决, 思路是版本号
7, 乐观锁的业务场景及实现方式: 数据库采用版本号来解决记录的并发更新
来源: http://www.bubuko.com/infodetail-2611716.html