Java面试脑图风暴
2022-02-22 23:25:21 2 举报
Java面试脑图风暴
作者其他创作
大纲/内容
独占:虚拟机栈:存放栈帧本地方法栈:存放Native栈帧程序计数器:java方法存字节码的行号、Native方法自为NULL
ThreadPoolExecutor1.核心线程数2.最大线程数3.空闲线程的最大存活时间4.单位5.任务队列6.线程工厂7.拒绝策略:异常,丢掉最老任务,与初始线程竞争,交给主线程,自定义
线程池优点:1.避免线程频繁创建与关闭2.统一管理线程
线程的创建方式:1.继承Thread,重写Run方法2.给Thread传入runnable匿名内部类,Lamda表达式3.FutureTask传入Callable匿名内部类4.线程池:Executors获取实例线程池
创建方式比较1.类是单继承多实现2.线程池优点
运行常量池1.7JDK在方法区的实现:永久代1.8JDK:在堆空间,堆空间脱离了JVM内存,在物理内存中。
JVM内存结构
线程安全的实现同步:悲观锁:Synchronized、lock;乐观锁:CAS不同步:ThreadLocal
隔离性:Read-Uncommit:读未提交Read-Commit:读已提交Repeatable-Read:可重复读Serializable:串行
1.JMM一种抽象的概念。描述的是一组规则,围绕原子性、有序性、可见性展开。2.java分成了主内存和工作内存,有两个关键字Synchronized,Volatile。4.Volatile可见性:lock指令,刷新工作内存的值到主内存。其他工作内存也要直达这个值被修改了,通过锁总线或锁缓存解决,锁总线会导致其他工作线程停止,所以通过锁缓存的方式去实现,本质是通过缓存一致性协议去实现4.1.缓存一致性协议:MESI5.有序性:指令执行的过程中会在编译环节与CPU执行阶段进行重排序以提高效率。单线程情景下保证asif-serious原则多线程情景下提出:Happens-before语义判断数据是否存在竞争,线程是否安全的主要依据。()。底层是通过内存屏障实现。
lock:
JMM
ExtentionClassLoader
核心线程数配置:CPU密集型:线程数 = 核数 + 1I/O密集型(CPU等待较多):线程数 = CPU核数 * (1 + 平均工作时/平均等待时间)
类加载器
CAS:
AQS:抽象队列同步器
线程池的执行流程
ApplicationClassLoader:自定的类的类加载器
自定义类加载
比较:1.关键字与接口2.被动释放、主动释放3.公平与非公平4.lock粒度更细致5.lock等待可中断
加载:1.二进制字节流
BootStrapCloader:C++实现toString为null
Synchronized
1.JVM级别关键字2.修饰3种:普通方法,静态方法,代码块3.性质:原子性、可见性(monitoexit会刷新到主内存)、有序性(一次只有一个线程操作代码块)4.存储:对象头的MarkWord里。MarkWorld存储锁标识,HashCode,分代年龄。5.锁升级:无锁-偏向锁-轻量级锁-重量级锁。6.锁粗化:循环加锁-加锁循环字节码指令:加锁-monitorenter;解锁-monitoexit
锁池与等待池Sleep、wait
ThreadLocal
共享:堆空间:存储对象与数组方法区:类元信息=CLass模板
数据库特性:事务、索引、锁
java类加载过程
线程间如何通讯:Wait、notify、notifyall
Executors四大线程池:newSingleThreadExecutor:单线程newFixedThreadPool:固定线程newCachedThreadPool:自适应线程newScheduledThreadPool:循环线程
1.接口2.可重入锁:Reentrant
1.findClass:IOClass文件2.LoadClass方法:双亲委派类加载器去加载
线程安全:当多个线程访问某一个类(对象或方法)时,对象对应的公共数据区始终都能表现正确,那么这个类(对象或方法)就是线程安全的。
收藏
0 条评论
下一页
为你推荐
查看更多