首页 课程 师资 教程 报名

2020年最新干货,Java面试题总结

  • 2019-12-16 14:42:12
  • 1714次 动力节点

 

  很多人在找工作之前都会做不少的准备,有一份全面细致的面试题会给大家减少很多麻烦,所以准备找工作的同学可以参考看看:

2020年最新干货,Java面试题总结.jpg

  ThreadLocal(线程变量副本)

  Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量。

  采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。

  ThreadLocal类中维护一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值为对应线程的变量副本。

  ThreadLocal在Spring中发挥着巨大的作用,在管理Request作用域中的Bean、事务管理、任务调度、AOP等模块都出现了它的身影。

  Spring中绝大部分Bean都可以声明成Singleton作用域,采用ThreadLocal进行封装,因此有状态的Bean就能够以singleton的方式在多线程中正常工作了。

  “你能不能谈谈,java GC是在什么时候,对什么东西,做了什么事情?”

  在什么时候:

  1、新生代有一个Eden区和两个survivor区,首先将对象放入Eden区,如果空间不足就向其中的一个survivor区上放,如果仍然放不下就会引发一次发生在新生代的minor GC,将存活的对象放入另一个survivor区中,然后清空Eden和之前的那个survivor区的内存。在某次GC过程中,如果发现仍然又放不下的对象,就将这些对象放入老年代内存里去。

  2、大对象以及长期存活的对象直接进入老年区。

  3、当每次执行minor GC的时候应该对要晋升到老年代的对象进行分析,如果这些马上要到老年区的老年对象的大小超过了老年区的剩余大小,那么执行一次Full GC以尽可能地获得老年区的空间。

  对什么东西:

  从GC Roots搜索不到,而且经过一次标记清理之后仍没有复活的对象。

  做什么:

  新生代:复制清理; 老年代:标记-清除和标记-压缩算法; 永久代:存放Java中的类和加载类的类加载器本身。

  GC Roots都有哪些: 1. 虚拟机栈中的引用的对象 2. 方法区中静态属性引用的对象,常量引用的对象 3. 本地方法栈中JNI(即一般说的Native方法)引用的对象。

 

2020年最新干货,Java面试题总结.jpg

 

  Synchronized 与Loc

  Synchronized 与Lock都是可重入锁,同一个线程再次进入同步代码的时候。可以使用自己已经获取到的锁。

  Synchronized是悲观锁机制,独占锁。而Locks.ReentrantLock是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。

  ReentrantLock适用场景

  1、某个线程在等待一个锁的控制权的这段时间需要中断;

  2、需要分开处理一些wait-notify,ReentrantLock里面的Condition应用,能够控制notify哪个线程,锁可以绑定多个条件;

  3、具有公平锁功能,每个到来的线程都将排队等候。

  StringBuffer是线程安全的,每次操作字符串,String会生成一个新的对象,而StringBuffer不会;StringBuilder是非线程安全的。

  fail-fast是什么?

  fail-fast:机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。

  例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。

  happens-before

  happens-before:如果两个操作之间具有 happens-before 关系,那么前一个操作的结果就会对后面一个操作可见。

  1、程序顺序规则:一个线程中的每个操作,happens- before 于该线程中的任意后续操作。

  2、监视器锁规则:对一个监视器锁的解锁,happens- before 于随后对这个监视器锁的加锁。

  3、volatile变量规则:对一个volatile域的写,happens- before于任意后续对这个volatile域的读。

  4、传递性:如果A happens- before B,且B happens- before C,那么A happens- before C。

  5、线程启动规则:Thread对象的start()方法happens- before于此线程的每一个动作。

  Volatile和Synchronized的不同点

  Volatile和Synchronized四个不同点:

  1、粒度不同,前者针对变量 ,后者锁对象和类;

  2、syn阻塞,volatile线程不阻塞;

  3、syn保证三大特性,volatile不保证原子性;

  4、syn编译器优化,volatile不优化 volatile具备两种特性:

  保证此变量对所有线程的可见性,指一条线程修改了这个变量的值,新值对于其他线程来说是可见的,但并不是多线程安全的;

  禁止指令重排序优化。

  Volatile如何保证内存可见性:

  1、当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存。

  2、当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。

  同步:就是一个任务的完成需要依赖另外一个任务,只有等待被依赖的任务完成后,依赖任务才能完成。

  异步:不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,只要自己任务完成了就算完成了,被依赖的任务是否完成会通知回来。(异步的特点就是通知)。 打电话和发短信来比喻同步和异步操作。

  阻塞:CPU停下来等一个慢的操作完成以后,才会接着完成其他的工作。

  非阻塞:非阻塞就是在这个慢的执行时,CPU去做其他工作,等这个慢的完成后,CPU才会接着完成后续的操作。

  非阻塞会造成线程切换增加,增加CPU的使用时间能不能补偿系统的切换成本需要考虑。

 

2020年最新干货,Java面试题总结.jpg

 

  CAS

  CAS(Compare And Swap) 无锁算法: CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。

  CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

  类加载器工作机制

  装载:将Java二进制代码导入jvm中,生成Class文件。

  连接:

  a)校验:检查载入Class文件数据的正确性;

  b)准备:给类的静态变量分配存储空间;

  c)解析:将符号引用转成直接引用。

  初始化:对类的静态变量,静态方法和静态代码块执行初始化工作。

  双亲委派模型:类加载器收到类加载请求,首先将请求委派给父类加载器完成,用户自定义加载器->应用程序加载器->扩展类加载器->启动类加载器。

  Redis数据结构

  String—字符串(key-value 类型)

  Hash—字典(hashmap) Redis的哈希结构可以使你像在数据库中更新一个属性一样只修改某一项属性值

  List—列表 实现消息队列

  Set—集合 利用唯一性

  Sorted Set—有序集合 可以进行排序 可以实现数据持久化

  索引:B+,B-,全文索引

  Mysql的索引是一个数据结构,旨在使数据库高效的查找数据。

  常用的数据结构是B+Tree,每个叶子节点不但存放了索引键的相关信息还增加了指向相邻叶子节点的指针,这样就形成了带有顺序访问指针的B+Tree,做这个优化的目的是提高不同区间访问的性能。

  什么时候使用索引:

  1、经常出现在group by,order by和distinc关键字后面的字段。

  2、经常与其他表进行连接的表,在连接字段上应该建立索引。

  3、经常出现在Where子句中的字段。

  4、经常出现用作查询选择的字段。

  Spring IOC

  Spring支持三种依赖注入方式,分别是属性(Setter方法)注入,构造注入和接口注入。

  在Spring中,那些组成应用的主体及由Spring IOC容器所管理的对象被称之为Bean。

  Spring的IOC容器通过反射的机制实例化Bean并建立Bean之间的依赖关系。

  简单地讲,Bean就是由Spring IOC容器初始化、装配及被管理的对象。

  获取Bean对象的过程,首先通过Resource加载配置文件并启动IOC容器,然后通过getBean方法获取bean对象,就可以调用他的方法。

  Spring Bean的作用域:

  Singleton:Spring IOC容器中只有一个共享的Bean实例,一般都是Singleton作用域。

  Prototype:每一个请求,会产生一个新的Bean实例。

  Request:每一次http请求会产生一个新的Bean实例。

 

2020年最新干货,Java面试题总结

 

      以上就是动力节点Java培训机构小编介绍的“2020年最新干货,Java面试题总结”的内容,希望对大家有帮助,如有疑问,请在线咨询,有专业老师随时为你服务。

 

相关推荐

最新最全java面试题及答案(初级到高级)

史上最全的中高级JAVA工程师面试题及答案汇总

Java高级开发工程师面试题

2019史上最全java面试题题库大全800题

哪有资深java工程师面试题

 

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交