Day288,Redis面试复习大纲在手面试不慌

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

保证生产消费平衡,通过一个异步的队列来实现


  • 什么是生产者消费者模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2SZEFIqf-1622819653543)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210604215607948.png)]

生产者生成往queue队列中放,queue队列满了生产阻塞;

消费者消费queue队列,queue队列没了消费阻塞;

生产者生成会向消费者通知消费;

消费者消费会向生成者通知生成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T6YohrLE-1622819653546)(C:/Users/PePe/AppData/Roaming/Typora/typora-user-images/image-20210604215617852.png)]


  • 手写代码,通过wait/notify实现生产者消费者模式

/******

@author 阿昌

@create 2021-05-22 20:58


  • 用wait/notify来实现 生产者消费者模式

*/

public class ProducerConsumerModel {

//主函数

public static void main(String[] args) {

EventStorage eventStorage = new EventStorage();

Consumer1 consumer = new Consumer1(eventStorage);

Producer1 producer = new Producer1(eventStorage);

Thread threadConsumer = new Thread(consumer);

Thread threadProducer = new Thread(producer);

threadConsumer.start();

threadProducer.start();

}

}

//生产者

class Producer1 implements Runnable{

private EventStorage storage;

public Producer1(EventStorage storage) {

this.storage = storage;

}

@Override

public void run() {

for (int i = 0; i < 100; i++) {

storage.put();

}

}

}

//消费者

class Consumer1 implements Runnable{

private EventStorage storage;

public Consumer1(EventStorage storage) {

this.storage = storage;

}

@Override

public void run() {

for (int i = 0; i < 100; i++) {

storage.take();

}

}

}

//队列

class EventStorage{

private int maxSize;

private LinkedList storage;

public EventStorage(){

this.maxSize=10;

storage = new LinkedList<>();

}

//生成产品

public synchronized void put(){

//如果满了

while (storage.size()==maxSize){

try {

wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//如果没满

storage.add(new Date());

System.out.println(“生产者生产了产品,仓库里有了”+storage.size()+“个产品”);

notify();

}

//消费产品

public synchronized void take(){

//如果空了

while (storage.size()<=0){

try {

wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//如果没空

System.out.println(“消费者消费了产品,拿到了”+storage.poll()+“,现在仓库还剩下”+storage.size());

notify();

}

}


  • 为什么wait必须在同步代码块中使用

防止在wait之后没有notify唤醒


  • 为什么线程通信的wait、notify、notifyAll被定义在object类中,而sleep定义在thread类中

因为在java中每个对象都是一把锁,虽然thread类中也有wait等,但是是不推荐的


  • wait方法属于object,那调用wait会怎么样

thread类在运行结束之后自动调用notify,会扰乱我们的逻辑


  • 如何选择用notify 还是notifyAll

优先选中notifyAll,除非要求每次只唤醒一个线程,才去使用notify


  • notifyAll后所有线程都会再次抢锁,如果某个线程抢夺失败了会怎么样

不会发送错误,而是等待下一次释放锁后再去抢夺


  • 用suspend和resume来阻塞线程可以吗?为什么?

不推荐,由于安全问题,方法已经过时


  • wait/notify、sleep的异同

wait属于object类,sleep属于thread类;

wait释放锁,sleep不释放锁;


  • 在join期间,线程处于什么线程状态

处于waiting状态,他底层就是调用了wait方法


  • yield和sleep的区别

  • 守护线程和普通线程的区别

区别在于JVM,守护线程服务普通线程,当普通线程数量为0,那么JVM就会被关闭;守护线程不会影响到jvm的结束


  • 我们需要给线程设置为守护线程吗

不需要,因为java自带的守护线程足够我们使用


  • 为什么程序设计不依赖于线程优先级

因为不同的操作系统对于线程优先级采用的策略都不一样,所以不推荐依赖线程优先级


  • 讲一讲Java异常体系

他们继承于Throwable,分为error 和exception;exception下面还分为runtimeexception和非runtimeexception


  • 实际工作中,如何全局处理异常

写一个全局异常处理器,来捕获异常


  • run方法是否可以抛出异常?如果抛出异常?线程状态会怎么样?

不可以抛出异常,如果抛出,线程就会终止


  • 一共有几类线程安全问题

3类


  • 那些场景需要额外注意线程安全问题?

资源共享…


  • 为什么多线程会带来性能问题

因为切换线程会带来上下文切换,用内存保存上下文环境和加载上下文环境


  • Java代码是如何转化,最终被CPU执行

先生成.java文件,然后javac生成字节码文件.class,然后通过jvm读取加载.class文件,生成机器代码,被cpu执行解读


  • 单例模式的作用和使用场景

  • 单例模式的多种写法、单列和高并发的关系

  • 单例各种写法的使用场景

  • 饿汉式的缺点

消耗资源,一上来就加载


  • 懒汉试的缺点

可能造成线程安全问题


  • 为什么要用double-check,不用就不安全吗?

  • 为什么双重检查模式要使用volatile

因为构造方法生成对象的过程包含3步骤,不是原子性的,所以会出现可见性和重排序问题


  • 最好的单例模式实现是什么?

枚举实现


  • 讲一讲什么是java内存模型

  • 什么是happens-before

表达可见性问题


  • Happens-before的规则

sychronized和lock锁的原则,等等等


  • 讲讲volatile关键字

  • volatile的使用场景

使用于做触发器;赋值场景


  • volatile的作用

直接将线程内存刷入主内存;保证该变量具有可见性和防重排序问题


  • volatile和sychronized的异同

volatile是轻量级是sychronized的等。。。。使用的不用场景


  • 什么会发生内存可见性问题?

因为cpu是多层缓存结构


  • 你知道主内存和本地内存吗?他们是什么

不同的线程拥有自己的本地内存,他们共用一个主内存做为交互通道


  • 主内存和本地内存的关系

本地内存之间的交互必须通过主内存;

每一个线程都有自己的本地内存;


  • 什么是原子操作

写在最后

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

Mybatis面试专题

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

MySQL面试专题

蚂蚁金服三面直击面试官的Redis三连,Redis面试复习大纲在手,不慌

并发编程面试专题

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 主内存和本地内存的关系

本地内存之间的交互必须通过主内存;

每一个线程都有自己的本地内存;


  • 什么是原子操作

写在最后

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!

最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。

[外链图片转存中…(img-X66jNi3q-1713249573987)]

Mybatis面试专题

[外链图片转存中…(img-oIPHnpps-1713249573987)]

MySQL面试专题

[外链图片转存中…(img-ZF3SfR1g-1713249573988)]

并发编程面试专题

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-uXFaGsKe-1713249573988)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值