目录
- 1.java支持多继承吗
- 2.线程的生命周期
- 3.线程和进程的区别
- 4.单例模式有几种
- 5.写一下双重锁的单例
- 6.jvm有哪些区域
- 7.jvm哪些区域是线程共享的,哪些是线程私有的
- 8.gc中判断对象可回收的方式有哪些
- 9.gc垃圾回收算法有哪些
- 10.哪些对象可以作为gc root
- 11.gc中的引用计数法有哪些缺陷
- 12.抽象类和接口的区别
- 13.sleep和wait的区别
1.java支持多继承吗
Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。
接口支持多继承
public interface Bird extends Flyable,Singable {}
2.线程的生命周期
初始化状态(NEW)、可运行/运行状态(RUNNABLE)、阻塞状态(BLOCKED)、无时限等待状态(WAITING)、有时限等待状态(TIMED_WAITING)、终止状态(TERMINATED)
3.线程和进程的区别
进程
是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行『资源分配和调度』的一个独立单位。
线程
进行运算调度的最小单位,其实是进程中的一个执行任务(控制单元),负责当前进程中程序的执行
两者之间的区别
「本质区别」:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
「在开销方面」:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小
「所处环境」:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
「内存分配方面」:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源
「包含关系」:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程
4.单例模式有几种
5种
饿汉式
懒汉式
双重检查锁
静态内部类
内部枚举类
https://donglin.blog.csdn.net/article/details/128773676
5.写一下双重锁的单例
public class Singleton {/*** 私有构造*/private Singleton(){System.out.println("构造函数Singleton");}//加volatile关键字是为了防止 创建对象时的指令重排问题,导致其他线程使用对象时造成空指针private volatile static Singleton singleton = null;public static Singleton getInstance(){if (singleton == null){ //这个检查是提高效率的synchronized (Singleton.class){if (singleton == null){singleton = new Singleton(); //这个检查是防止线程安全的}}}return singleton;}}
6.jvm有哪些区域
7.jvm哪些区域是线程共享的,哪些是线程私有的
方法区,堆共享
程序计数器,本地方法栈,虚拟机栈私有
8.gc中判断对象可回收的方式有哪些
引用计数算法和可达性分析算法
https://donglin.blog.csdn.net/article/details/127831153
9.gc垃圾回收算法有哪些
标记-清除算法
复制算法
标记-压缩算法
分代收集算法
增量收集算法
分区算法
https://donglin.blog.csdn.net/article/details/127831153
10.哪些对象可以作为gc root
- 虚拟机栈(栈帧中的本地变量表)中引用的对象
- 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
https://donglin.blog.csdn.net/article/details/128782888
11.gc中的引用计数法有哪些缺陷
缺点1:它需要单独的字段存储计数器,这样的做法增加了存储空间的开销。
缺点2:每次赋值都需要更新计数器,伴随着加法和减法操作,这增加了时间开销。
缺点3:引用计数器有一个严重的问题,即无法处理循环引用的情况。这是一条致命缺陷,导致在Java 的垃圾回收器中没有使用这类算法。
https://donglin.blog.csdn.net/article/details/127831153
12.抽象类和接口的区别
从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
1.接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
2.类可以实现很多个接口,但是只能继承一个抽象类
3.类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
4.抽象类可以在不提供接口方法实现的情况下实现接口。
5.Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
6.接口是绝对抽象的,不可以被实例化,抽象类也不可以被实例化。
第三点证明
13.sleep和wait的区别
1、sleep是线程中的方法,但是wait是Object中的方法。
2、sleep方法不会释放资源锁,但是wait会释放资源锁,而且会加入到等待队列中。
3、sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。
4、sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)。
https://donglin.blog.csdn.net/article/details/125922659