小米Java面经-1

1、自我介绍
姓名、教育经历、项目经理、个人荣誉、专业知识

2、项目
将手机端实时采集到的BLE数据包转化成指纹序列,利用实时数据生成的指纹序列,识别出用户当前所处的位置

3、面向对象的理解
面向对象:基于”万物皆为对象“的思想,类比于对自然界各种事物进行分类,而某一类别的每一个事物是这个类别中的一个实例,同时每个实例有自己的属性和方法,将这些属性和方法抽象出来,生成这个类的属性和方法

4、反射
Java的反射机制;程序在运行时,1、构建、2、了解、3、了解、4、调用
如何实现反射:
原理:。。。内存中生成一个Class对象,从该Class对象中可以获得类的许多基本信息
百度百科:Java反射机制
反射机制所需的类主要有java.lang包中的Class类和java.lang.reflect包中的Constructor类、Field类、Method类和Parameter类。Class类是一个比较特殊的类,它是反射机制的基础,Class类的对象表示正在运行的Java程序中的类或接口,也就是任何一个类被加载时,即将类的.class文件(字节码文件)读入内存的同时,都自动为之创建一个java.lang.Class对象。Class类没有公共构造方法,其对象是JVM在加载类时通过调用类加载器中的defineClass()方法创建的,因此不能显式地创建一个Class对象
通过这个Class对象,才可以获得对应类的其他信息

5、内部类
内部类:定义放在另一个类内部的类
分类:静态和非静态
使用场景:
如何创建内部类的实例

6、static关键字
类成员,成员变量-》静态变量 成员方法-》静态方法,属于该类的所有实例,可以通用类名.成员变量 或 类名.方法名
补充:修饰基本数据类型变量;引用类型变量;静态方法中不可以使用非静态成员,因为非静态成员依赖于被创建的实例
静态代码块:对静态变量初始化;注意:在类方法外,可以有多个静态类代码快,在类加载的初始化过程中被执行,用于给静态成员变量赋正确的初始值
静态内部类:
静态导包:导入静态资源

7、JMM,Java内存模型,
是什么:一套规范
作用是什么:效果
内容:主内存,线程的工作内存,线程数据操作的方式,原子性(锁)、可见性(没有及时将修改更新到主存)、有序性(代码重编译)

8、同步有几种方式:同步方法、同步代码块、volatile修饰的变量(特殊域变量volatile)、原子性操作、可重入锁、ThreadLocal局部变量

9、Lock可重入锁

10、锁升级

锁一共有4种状态,级别从低到高依次是:无锁偏向锁轻量级锁重量级锁

synchronized关键字:
synchronized可以修饰静态方法、成员函数,同时还可以直接定义代码块,但是归根结底它上锁的资源只有两类:一个是对象,一个是类

原子性:一个或多个操作,要么全部执行成功且执行过程中不会被任何因素打断,要么就都不执行,
可见性:可见性是指多个线程访问一个资源时,该资源的状态、值信息等对于其他线程都是可见的
有序性:有序性值程序执行的顺序按照代码先后执行

volatile修饰的变量不具有原子性;其实严格的说,对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性,因为++这种操作是由桑额原子操作组合而成,在组合操作中,读取后,不会再次读取

偏向锁:大多数情况下,锁总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁
原理:记录获得偏向锁的进程ID,以后该线程在进入和退出同步块时不需要进行CAS操作来加锁和解锁,只需简单地测试一下对象头的Mark Word里是否存储着指向当前线程的偏向锁
如果测试成功,表示线程已经获得了锁。如果测试失败,则需要再测试一下Mark Word中偏向锁的标识是否设置成1(表示当前是偏向锁):如果没有设置,则使用CAS竞争锁;如果设置了,则尝试使用CAS将对象头的偏向锁指向当前线程
详细过程:
1、线程2来竞争锁对象;
2、判断当前对象头是否是偏向锁;
3、判断拥有偏向锁的线程1是否还存在;
4、线程1不存在,直接设置偏向锁标识为0(线程1执行完毕后,不会主动去释放偏向锁);
5、使用cas替换偏向锁线程ID为线程2,锁不升级,仍为偏向锁;
6、线程1仍然存在,暂停线程1;
7、设置锁标志位为00(变为轻量级锁),偏向锁为0;
8、从线程1的空闲monitor record中读取一条,放至线程1的当前monitor record中;
9、更新mark word,将mark word指向线程1中monitor record的指针;
10、继续执行线程1的代码;
11、锁升级为轻量级锁;
12、线程2自旋来获取锁对象;

可重入锁:线程获得了锁,还可以重复的申请锁

posted @   紫薇哥哥  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示