个人待了解问题

先列出来,慢慢了解学习。加油!

  1. Volatile关键字的底层实现原理:个人理解,基于jvm内存模型,volatile关键字所作用的变量等是调用时会通知主存,A线程正要修改这个变量,主内存同时通知其他工作内存这个变量已经被锁定,修改,之后A线程通过线程的工作内存将变量回写到主存中,若其他线程在调用这个volatile修饰的变量时会去主存重新获取变量并缓存到线程自己的工作内存。volatite可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。volatile经常用于两个两个场景:状态标记、double check

  2. List、Map、Set,问的是各种实现类的底层实现原理,ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet等。ArrayList是基于数组结构实现的,ArrayList包含了两个重要的对象:elementData (Object[])和 size;LinkedList是双端链表结构,有两个变量,first指向链表头部,last指向链表尾部,size表示个数;HashTable也是基于散列表,大都和Hashmap原理一致,但是两个有区别(线程安全等);HashMap:HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的;ConcurrentHashMap:采用了分段锁策略,ConcurrentHashMap的主干是个Segment数组,Segment实现了ReentrantLock,是可重入锁,一个Segment即为一个哈希表,一个Segment维护一个hashEntry数组,所以并发不用考虑锁竞争。
  3. Thread和Runnable的区别和联系、多次start一个线程会怎么样:实现Runable接口更适合资源共享,多用Runable方式,Thread也是实现Runable中的子类,线程池中只能存放Runable或Callable,而不能直接存放Thread;会报错:java.lang.IllegalThreadStateException   线程状态非法异常   继承关系是:--->extends IllegalArgumentException--->extends RuntimeException一个运行时异常

  4. 假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现:Java.util.concurrent等待其他线程结束执行(CountDownLatch,join)

  5. 常用的线程池有几种?这几种线程池之间有什么区别和联系?线程池的实现原理是怎么样的:newCachedThreadPool(默认大小Interger. MAX_VALUE,默认最大空闲时间1min)线程池,为一个不限制大小的线城池有需要就创建,当线程空闲了默认时间则会进行停止,当新的工作任务提交进来会创建新的线程进行处理;newFixedThreadPool(线程池的大小最好根据系统资源设置):创建一个指定线程大小的线程池,当任务提交会创建新的线程,超过指定大小后,将任务放到池队列中,默认保留设置大小的线程资源;newSingleThreadExecutor即只创建单线程的线程池处理任务,保证任务调度顺序(FIFO,LIFO,优先级)等顺序,保证任意时刻不会有多个线程活动;newScheduleThreadPool为定长的线程池,定时周期性的执行任务。原理:循环利用线程,避免线程创建销毁的资源浪费,保留在线程池中,当任务提交时,会首先检查线程池中是否有空闲线程,是否小于核心线程数,当满足条件是则创建线程直接将任务交给该线程处理,当已到达核心线程数,则判断线程池队列是否已满,未满提交给线程池队列排队等待执行,当线程池队列已满,则判断当前线程数,是否大于最大线程数,如果小于最大线程数,则创建线程并将任务交与该线程执行,当已经到达了最大线程数,则会调用线程池的拒绝策略处理任务。
  6. 多线程同步、锁这块也是重点。synchronized和ReentrantLock的区别、synchronized锁普通方法和锁静态方法、死锁的原理及排查方法等等
  7. 此理解阻塞IO、非阻塞IO、多路复用IO、异步IO这四种IO模型
  8. NIO的原理、NIO属于哪种IO模型、NIO的三大组成等等(Netty)
  9. Java虚拟机的内存模型,GC算法及几种垃圾收集器,
  10. 类加载机制,也就是双亲委派模型
  11. Filter、Servlet、Listener
  12. 谈谈分布式Session实现原理
  13. HTTPS的实现原理
  14. start()和run()区别
  15. 简述悲观锁和乐观锁
  16. 一个http请求从开始到结束都经历了哪些过程
  17. jdk1.8新特性
  18. Runnable接口和Callable接口的区别
  19. 分布式环境下,怎么保证线程安全
  20. 了解CAS技术:compare and swap
  21. sql优化问题,
  22. 数据库性能的优化
  23. cpu占用高怎么解决:linux 首先查询当前占用高的进程(top命令),然后查看进程中哪个线程占用多(Ps -mp pid -o THREAD,tid,time),然后把进程id转化16进制,在用命令查询进程(jstack -pid | grep 2x53),然后查看报错行进行代码分析。引用解决方案
  24. 类加载器(ClassLoader)实现原理:种类可分为,启动类加载器,Bootstrap ClassLoader,加载JACA_HOME\lib,或者被-Xbootclasspath参数限定的类,扩展类加载器,Extension ClassLoader,加载\lib\ext,或者被java.ext.dirs系统变量指定的类,应用程序类加载器,Application ClassLoader,加载ClassPath中的类库,自定义类加载器,通过继承ClassLoader实现,一般是加载我们的自定义类。类加载遵循双亲委派原则即为每次加载类都会首先找到父类加载器,最终委派到顶层启动类加载器,若无法加载,则子类尝试自己加载。创建自定义类加载器:要继承java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,要符合双亲委派规范,则重写findClass方法(用户自定义类加载逻辑);要破坏的话,重写loadClass方法(双亲委派的具体逻辑实现)。类加载的过程:加载->连接->初始化->使用->卸载,其中连接过程又可分为:验证->准备->解析三个步骤。
  25.   垃圾回收算法及回收器(查看详细):垃圾回收主要集中在 java 堆和方法区中,栈其他对象大都随线程而生,随线程而灭,不需要额外回收。进行回收之前首先要判断对象是否存活,目前所知有两个算法去判断是否存活,引用计数法和可达性分析法(GC Roots:虚拟机栈中引用对象,方法区中类静态属性实体引用对象,方法区中常量引用对象,本地方法栈中JNI引用对象)。垃圾清理的算法包括:标记-清理算法(Mark-Sweep):标记所有需要回收的对象,然后依次全部清除。但是有不足,一是效率问题,标记和清除两个过程效率都不是很高,二是空间问题会产生很多碎片,对于大对象无法分配空间;复制算法(Copying):将内存分为大小相等的两块,每次用一块,当一块内存用问了,将存货的对象移动到另一块,然后将本快内存全部清除;标记-整理算法(Mark-Compact):让多有存活的对象向一端移动,然后清理掉边界以外的空间。;分代收集算法(Generational Collection):分为新生代和老年代,新生代堆已死对象进行清除,少量存活的对象迁移到老年代。然后老年代才用标记-清除算法或者标记-整理算法进行清理。垃圾收集器主要是:Serial收集器:最古老,最稳定以及效率高的收集器,串行收集器,一个线程去新生代和老年代里去执行串行回收,新生代复制算法,老年代标记-压缩算法,垃圾收集过程暂停服务(Stop-The-World);ParNew收集器:相当于多线程的Serial收集器,新生代并行,老年代串行,其他区别不大。Parallel收集器:Parallel Scavenge  主要关注系统吞吐量,虚拟机会根据当前系统情况控制停顿时间和最大吞吐量。老年代收集器Parallel Old收集器: Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法。CMS收集器和G1收集器详细请见查看详细
  26. CMS、G1收集器:CMS(concurrent mark sweep):一种以获取最短回收停顿时间为目标的收集器,可分为四部,初始标记,并发标记,重新标记,并发清楚。步骤中初始标记和重新标记仍需要Stop-The-World。初始标记仅仅标记能被GC Root直接关联的对象,速度很快,而重新标记则会执行GC Root Tracing(可达性分析),重新标记主要是针对并发标记阶段因用户操作导致对象重新可达,重新标记阶段比初始标记要长但是比并发标记还是短的。优点大致为并发收集低停顿。缺点则是并发阶段降低系统吞吐量,无法处理浮动垃圾和并发模式异常,会出现大量空间碎片。
  27. G1收集器:初始标记,并发标记,最终标记,筛选回收。其特点大致为:并行收集通过多CPU缩短停顿时间,并行于java程序执行。分代收集,空间整合,可预测停顿。(可百度查看)
  28. CAS,CAS缺点及解决方案:Compare-And-Swap,比较并替换,其原理大致:三个操作值,内存地址V,期望值A,欲更新值B,当且仅当内存地址V的值为A时才会执行更新操作,否则责会重新执行。缺点是:cpu负重增加,当多线程同时执行更新,反复不成功则增加cpu开销;只保证单一变量的原子性,不保证多变量的原子性,ABA问题。ABA问题解决方案可用AtomticStampedReference/AtomicMarkableReference来解决ABA问题。其单一变量原子性由于原子类的底层是由unsafe实现的。
  29. AQS实现原理AbstractQueuedSynchronizer,一个线程安全的队列,维护一堆被挂起的线程。
  30. Redis实现分布式锁,并发问题解决,缓存失效策略:
  31. 分布式系统怎么做服务治理:
  32. 如何实现负载均衡
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值