1.对象的创建过程![](https://img-blog.csdnimg.cn/f41aa1bb0b034d81a0df623d2dd9a50a.png)
2.DCL单例 到底需不需要volatile ?
3.对象在内存中的存储布局![](https://img-blog.csdnimg.cn/68fb4f496cfa44a4920e8ec60f0dfc49.png)
4.线程的实现方式
这种方式比继承Thread类好,因为在java中是单继承多实现!
此方法可是拿到异步执行任务的返回结果
当把一个任务提交到线程池时,线程池会创建一个工作线程,去帮助咱们执行任务
1.
2.FutureTask
3.线程池
每次构建的工作线程都是Worker
5. java中线程的状态![](https://img-blog.csdnimg.cn/6ee83546c5144a79b11bd78d6a0dca3d.png)
1.新建状态:此时线程还没有被启动
2.就绪状态(可运行状态):线程启动后到达就绪状态,此时CPU可以调度这个就绪状态的线程
3.运行状态: 线程可以执行字节码等一些指令
执行过程中如果接收到了 wait(),sleep(),join()等指令,那么线程就进入(等待状态)
4.等待状态:在这个状态下的线程,不收CPU调度
当线程从等待状态 变为- 就绪状态后,整个run方法执行结束,最终会进入结束状态
6种状态
6.java如何停止线程?
1.stop方法
3.使用interrupt
使用共享变量方式,在线程内容有一个中断标记位
线程在休眠状态可以改变使用interrupt方法修改标记位状态,终止线程
7.sleep和wait方法的区别是什么?
wait方法为什么必须在持有锁时才能执行?
答:当我在获取到synchronized 同步锁后,我执行了wait方法,发生了什么事情?
synchronized 底层是ObjectMonitor,当线程持有锁后,会在_owner位置,设置为持有锁的线程,
_recursions 持有锁重复的次数。 当线程持有同步锁,并执行了wait(),我需要把这个线程放入_waitSet 里面,证明我的线程到了waiting 状态,已经在等待。只有把线程唤醒后,才会重新竞争锁资源。
synchronized 是一把对象锁,对象锁是基于(对象头)里面的(MarkWord)指向了我们看到的ObjectMonitor。
如果在没有锁的状态下去操作锁里面的ObjectMonitor,这是不可以的。
8.并发编程的三大特性?
原子性:避免多线程在操作共享变量时,带来的线程安全问题
基于 volatile 和 happens-before 来避免指令重排
7.什么是CAS? 有什么优缺点?
9. Java中的四种引用类型
10.ThreadLocal的内存泄露问题?
1. 针对Key内存泄露,ThreadLocal已经基于弱引用解决
2.基于value,如果你使用的是线程池,会导致线程对象一直存在,但是我却找不到具体的value,
这时只要线程使用完毕ThreadLocal,执行一个remove(),就能解决内存泄露
11.Synchronized锁的实现原理
12.索引有哪几种类型?
13.最佳左前缀法则
14.索引下推
15.以%开头为什么索引会失效
将要查询的字段展示出来,并且此字段在联合索引的最左列
16.Innodb和MyIsam的区别
16.redis 为什么快?![](https://img-blog.csdnimg.cn/e0f613ea63684ae69e8f180bbb98a6e6.png)
17.Redis使用场景
18.为什么使用Redis?