java后端面试题

JVM加载class文件的原理机制

Java中的所有类,都需要由类加载器装载到JVM中才能运行。
Java的类加载器有三个,对应Java的三种类:负责加载系统类,扩展类,应用类。

  1. 装载:查找和导入class文件;
  2. 连接:
    (1)检查:检查载入的class文件数据的正确性;
    (2)准备:为类的静态变量分配存储空间;
    (3)解析:将符号引用转换成直接引用(这一步是可选的)
  3. 初始化:初始化静态变量,静态代码块。
    这样的过程在程序调用类的静态成员的时候开始执行,所以静态方法main()才会成为一般程序的入口方法。类的构造器也会引发该动作。

多线程相关

如何在Java中实现线程?

  1. 继承 java.lang.Thread 类
  2. 实现 java.lang.Runnable 接口

用什么方式创建线程比较好,用Runnable还是Thread?

Java不支持类的多重继承,但允许你调用多个接口。

Thread 类中的start() 和 run() 方法有什么区别?

start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。
当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。

Java中什么是竞态条件? 举个例子说明。

多线程对一些资源的竞争的时候就会产生竞态条件,如果首先要执行的程序竞争失败排到后面执行了,那么整个程序就会出现一些不确定的bugs。
一个例子就是无序处理

Java中如何停止一个线程?

你可以用volatile 布尔变量来退出run()方法的循环或者是取消任务来中断线程。

一个线程运行时发生异常会怎样?

简单的说,如果异常没有被捕获该线程将会停止执行。

如何在两个线程间共享数据?

你可以通过共享对象来实现这个目的,或者是使用像阻塞队列这样并发的数据结构。
阻塞队列 (BlockingQueue)是Java util.concurrent包下重要的数据结构,BlockingQueue提供了线程安全的队列访问方式:当阻塞队列进行插入数据时,如果队列已满,线程将会阻塞等待直到队列非满;从阻塞队列取数据时,如果队列已空,线程将会阻塞等待直到队列非空。并发包下很多高级同步类的实现都是基于BlockingQueue实现的。

Java并发编程的过程中遇到了什么挑战,Java内存模型

你必须知道如何处理死锁,竞态条件,内存冲突和线程安全等并发问题

java 请求url加时间戳有什么用

1,防止缓存。