多线程
1.java如何开启线程?怎么保证线程安全?
a.继承thread类重写run方法,实现runnable接口实现run方法,实现callable接口实现call方法(返回值),通过线程池创建
b.JDK提供的锁,使用Synchronized关键字及提供的其他锁lock
2.Volatile和Synchronized什么区别?Volatile能不能保证线程安全?DCL(Double Check Lock)单例为什么要加Valatile?
a.Sy关键字是用来加锁,volatile只是保证变量在线程之间的可见性
b.不能,volatile只能保证线程之间的可见性,不能保证原子性
c.使用volatile防止指令重排,解决多线程之间指令重排安全性问题
3.java线程锁机制是怎样的?偏向锁、轻量级锁、重量级锁的区别是什么及升级过程?
a.java的锁就是在对象的Markword中记录一个锁状态,不同的锁及无锁对应不同的锁状态
b.锁机制是根据资源竞争的激烈程度不断进行锁升级的过程
4. 谈谈对AQS的理解,AQS如何实现可重入锁?
a.AQS是java线程同步的框架。是JDK中很多锁工具的核心实现框架
在AQS中维护了一个信号量state和一个线程组成的双向链表队列,用来给线程排队,state控制是否放行
b.在可重入锁场景下,state是用来表示加锁的次数,0表示无锁。每加一次锁就加1,释放一次锁就减1
5.有ABC三个线程,如何保证三个线程同时执行?如何在并发情况下保证三个线程依次执行?如何保证三个线程有序交错执行?
CountDownlatch、Cylicbarrier、Semaphore
6.如何对一个字符串快速进行排序(多线程情况下作答)?
通过使用fork/join框架,分而治之,通过多线程处理先拆分计算,在合并结果
JVM
1.关于jvm内存模型理解
2.java类加载的全过程是怎样的?什么是双亲委派机制?有什么作用?
JAVA的类加载器:AppClassLoader->ExtClassLoader->BootStrapClassLoader
a.每个类加载器都有自己的加载目录
b.每个类加载器对加载过的类都有一个缓存
c.双亲委派:向上委托查找(缓存),向下委托加载;作用:是为了保护java的层的类不会被其他应用程序所覆盖
d.类的加载过程: 加载->连接->初始化
加载:把类的字节码文件(.class)加载到JVM内存中,并将其映射成JVM认可的数据结构
连接:1.验证:检查加载的字节信息是否符合JVM规范
2.准备:创建类和接口的静态变量,并赋予初始值,处于半初始化状态
3.解析:把符合引用转为直接引用
初始化 自己写的那些代码的执行
3.一个对象从加载到JVM,再到被GC清除,都经历了什么过程?
4.怎么确定一个对象是否是垃圾?什么是GC Root?
1.引用计数法,2.可达性分析法
5.JVM有哪些垃圾回收算法?
a.MarkSweep标记清除算法。b.拷贝算法。c.标记整理算法
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。