小米一面(2023-6-22)

一、Object类里面的方法有哪些

①hashcode方法
②equals方法
③wait方法
④notify方法
⑤notifyAll方法
⑥clone方法
⑦toString方法
⑧finalize方法
⑨getClass方法

二、hashcode()和equals()的作用

从hashMap入手,哈希码的值和哈希冲突,equals的对象比较等。

三、面向对象的特性

封装、继承、多态的三大特性。高内聚,低耦合。

四、四种引用

强引用,软引用,弱引用、虚引用

五、普通内部类和静态内部类的区别

①静态内部类相对与外部类是独立存在的,普通内部类作为外部类一个成员而存在。
②静态内部类中无法直接访问外部类中的变量、方法。如果要访问的话,必须要new一个外部类的对象,普通内部类中可以直接访问外部类属性,调用外部类的方法。

六、虚拟机JVM的内存模型结构

线程私有的虚拟机栈、程序计数器、本地方法栈。线程公有的方法区、堆区。然后就是JVM的堆区的分代思想。

七、双亲委派机制

启动类加载器—>扩展类加载器—>应用类加载器。保护核心API。
在这里插入图片描述

八、synchronized的原理

对象头的Mark Word记录着32bit信息(哈希码、分代年龄、偏向锁等记录),线程第一次占有的时候,栈空间有一个Lock Recod会用CAS交换对象头数据。当有线程来抢占的时候就会关联到Minitor(含有WaitSet/EntryList/Owner),此时就会加入到队列中。如下图所示。synchronized(xxx.Class){}
在这里插入图片描述
在这里插入图片描述

九、ReentrantLock的原理

①ReentrantLock是实现了接口Lock,基于AQS同步器的实现。
②ReentrantLock有公平锁FairSync和非公平锁NonFairSync,默认非公平锁。
③公平锁的实现就是谁等待时间最长,谁就先获取锁
④非公平锁就是随机获取的过程,谁运气好,cpu时间片轮询到哪个线程,哪个线程就能获取锁
⑤CAS操作抢占锁,抢占成功则修改锁的状态为1,将线程信息记录到锁当中,返回state=1。
⑥抢占不成功,tryAcquire获取锁资源,获取成功直接返回,获取不成功,新建一个检点插入到当前AQS队列的尾部,acquireQueued(node)表示唤醒AQS队列中的节点再次去获取锁。
⑦非公平锁维护一个state值,当为0的时候表示无锁,否则就是有锁,将其它线程放入队列中,当前面持有锁的对象释放后,后面的等待线程可以抢占锁。
在这里插入图片描述
在这里插入图片描述

十、常见的同步器和线程池

同步器:
①同步器有CountDownLatch、Semaphore、CyclicBarrier
②CountDownLatch维护一个state值可以大于1,若维护的值为n,每次线程释放都会调用countDown()方法将state值减一,减法计数器,当state减到0后又重新放入n个线程。
③CyclicBarrier和CountDownLatch相似。CountDownLatch : 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。CyclicBarrier : N个线程相互等待,任何一个线程完成之前,所有的线程都必须等待。
④Semaphore所维护的许可证数量就是允许访问共享资源的最大线程数量。Semaphore的基本使用场景是限制一定数量的线程能够去执行。举例说明:张三、李四和王五和赵六4个人一起去饭店吃饭,不过在特殊时期洗手很重要,饭前洗手也是必须的,可是饭店只有2个洗手池,洗手池就是不能被同时使用的公共资源,这种场景就可以用到Semaphore。当已经有两个人在洗手的时候,其他人就被阻塞,直到有人洗手完毕才是开始洗手。
线程池:
①降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
②提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
③提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
④线程常见的构造器和参数理解如下所示

//corePoolSize 核心线程数目 (最多保留的线程数) 
//maximumPoolSize 最大线程数目 
//keepAliveTime 生存时间 - 针对救急线程 
//unit 时间单位 - 针对救急线程 
//workQueue 阻塞队列 
//threadFactory 线程工厂 - 可以为线程创建时起个好名字 
//handler 拒绝策略
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)

在这里插入图片描述
在这里插入图片描述

十一、实现双向链表的插入和删除(算法题)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值