面试-基础篇

基本功

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、乐观锁的业务场景及实现方式:数据库采用版本号来解决记录的并发更新

猜你喜欢

转载自www.cnblogs.com/vindia/p/9070045.html