Java面试题
一、Java 基础 Java 内存模型(Java Memory model) JMM 是一组抽象的概念不是真实存在,他描述了一组规则或规范,通过这组规范来限定程序中变量的访问方式。Java 是基于虚拟机运行,在虚拟机规范中,定义了一组规范来屏蔽掉硬件以及不同操作系统之间对访问内存的差异,使得Java程序在跨平台中内存访问得到一致。 Java 线程之间的通信是由JMM控制的
JVM运行程序的实体是线程,而每个线程创建时 JVM 都会为其创建一个工作内存(有些地方称为栈空间),用于存储线程私有的数据,而Java 内存模型中规定所有变量都存储在主内存,其主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存复制到自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储这主内存中的变量副本拷贝,工作内存是每个线程的私有数据区域,因此不同的线程间无法访问对方的工作内存,线程间的通信(传值)必须通过主内存来完成。
如果一个对象只是这个线程私有的,那么他会被分配到主内存还是仅仅在该线程的工作内存? 应该是分配在主内存,因为生成对象的时候并不知道该对象是否会被线程共享 ![[Pasted image 20240812093554.png]]
如何控制变量在多线程之间共享 加锁:synchronized 关键,手动Lock等 volatile:volatile 关键字实现了MESI(缓存一致性协议),可以让共享变量的变更体现在各个线程中 Java 并发编程 sleep 和 wait 方法的 区别
sleep 是属于 Thread 类的,wait 是属于Object累的 sleep 不会释放锁, wait 会释放锁 sleep 可以在任何地方被调用,wait只能在同步代码块中被调用 synchronized 关键字如何实现的
monitor 对象,加锁是monitorenter ,解锁是monitorexit 强引用,弱引用,虚引用,软引用
强引用: 内存不够的时候也不会释放,哪怕发生OOM 软引用:内存不够时GC就会释放 弱引用: 只要是GC 就会释放 虚引用:是最弱的引用,对对象无感有和没有一样,主要用来判断对象鉴活的应用,可以用来做对外内存的释放 ThreadLocal 会导致内存溢出,为什么
如果线程一直在使用,例如线程池中的线程,那么ThreadLocal引用的对象就不能被释放,导致内存泄漏 解决办法就是:在使用ThreadLcal 结束时调用remove 方法 框架 Redis redis 数据结构 String list set zset hash redis 哨兵和集群模式 哨兵模式会有 哨兵服务器来监视 所有节点,检测健康,当主节点宕机之后,哨兵负责选举出新的主节点
read more