先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
正文
保证生产消费平衡,通过一个异步的队列来实现
- 什么是生产者消费者模式
生产者生成往queue队列中放,queue队列满了生产阻塞;
消费者消费queue队列,queue队列没了消费阻塞;
生产者生成会向消费者通知消费;
消费者消费会向生成者通知生成
- 手写代码,通过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(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
Mybatis面试专题
MySQL面试专题
并发编程面试专题
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!