X
Java后端
·07-24 10:45
Day 105(昨天的打卡) ✅ 今天做了: 1. 背单词√ 2. 面试题:√ 总结: 单词复习: 认识:75,模糊:27,忘记:23,顽固:3 问题: 受检测异常:Java编译器检查这类异常,需要在方法签名中使用throws或者使用try-cath捕获,比如IOException 非受检测异常:主要是程序逻辑上的问题,比如类型转换失败。 finally:无论是否发生异常,都保证会被执行。 但存在问题:异常覆盖:catch 块中已经抛出了一个异常,而 finally 块在执行清理时又抛出了一个新的异常,JVM 会丢弃原始的异常,只向上抛出 finally 中的异常。破坏正常的返回逻辑:finally 块中使用了 return 语句,它会直接导致方法结束,并覆盖掉 try 或 catch 块中原本要返回的值或要抛出的异常。并非绝对可靠。 throw:代码中主动抛出异常对象,通常是自己定义的业务逻辑 throws:用于方法签名上,主要是告诉调用者这个方法会抛出的异常,调用者可以try-catch或者继续向上抛。 只捕获你能处理的异常,不要“吞掉”异常,使用 finally 或 try-with-resources 释放资源,为异常提供有意义的信息在抛出异常时,附带清晰的描述性消息,异常链当捕获一个底层异常并抛出一个新的高层异常时,应将原始异常(cause)包装进去。这保留了完整的堆栈跟踪信息,便于排查问题。优先使用非受检异常处理编程错误,不要用异常来控制程序流程 Java的反射机制,就是程序在运行期间,可以像照镜子一样,动态地获取任何一个类的信息(它的属性、方法、构造函数等),并且能够动态地创建对象、调用方法、修改属性。它赋予了Java一种“自我剖析”和“自我操作”的能力。 获取Class对象有三种主要方式: 通过对象获取:anyObject.getClass() 通过类名获取:ClassName.class 通过类的全限定名获取:Class.forName("com.example.MyClass") 反射的优点: 框架设计的灵魂:Spring/SprintBoot的IoC控制反转(不需要自己去new对象由容器去创建对象) 动态代理:在运行时创建一个实现了指定接口的代理类,用来增强原始类的功能(比如添加日志、事务管理),这是AOP(面向切面编程)的基础。 工具和IDE:比如你用的Eclipse/IntelliJ IDEA,它的代码提示、自动补全、调试器等功能,都需要通过反射来分析你写的类。 注解处理器:需要在运行时被读取和处理,这也要靠反射。 缺点:性能开销大,破坏封装、类型不安全、代码可读性差,维护困难。 阻塞队列:生产者生产数据时,没有地方放了会阻塞,消费者拿数据时没有数据会阻塞。BlockingQueue 自动地协调了生产者和消费者之间的速度差异 ArrayBlockingQueue: - 由数组支持的有界阻塞队列。创建时必须指定容量,且容量不可变。 - 公平/非公平:可以通过构造函数 new ArrayBlockingQueue(capacity, fair) 设置公平性。公平模式下,等待的线程按 FIFO 顺序访问队列;非公平模式下,可能存在插队,吞吐量通常更高。 - 性能:内部使用一个锁(ReentrantLock)来控制生产者和消费者的访问,意味着两者不能同时操作。 LinkedBlockingQueue: - 底层结构:由链表支持的阻塞队列。 - 特点: - 可选有界:可以指定容量,也可以不指定。如果不指定,默认容量是 Integer.MAX_VALUE,相当于一个无界队列。 - 无界时的风险:如果生产者速度远快于消费者,可能导致内存耗尽(OOM)。 - 性能:内部使用两个锁(putLock 和 takeLock),一个用于入队,一个用于出队。这种“读写分离”的设计使得生产者和消费者可以并行操作,在高并发场景下吞吐量通常高于 ArrayBlockingQueue。 PriorityBlockingQueue: - 底层结构:一个支持优先级的无界阻塞队列。 - 特点: - 无界 (Unbounded):队列容量没有限制。 - 优先级排序:存入的元素必须实现 Comparable 接口,或者在构造时传入 Comparator。队列会根据元素的优先级进行排序,优先级高的元素先出队。 - 它不保证 FIFO,而是保证每次 take 出来的都是当前队列中优先级最高的元素。 SynchronousQueue: - 底层结构:一个不存储元素的阻塞队列,容量为 0。 - 特点: - 容量为零:它没有任何内部容量来缓存数据。 - 直接传递 (Hand-off):每个 put 操作必须等待一个对应的 take 操作,反之亦然。它更像一个“一手交钱,一手交货”的交易场所,而不是一个仓库。 - 高吞吐量:非常适合传递性场景,因为避免了数据在队列中的存储和管理开销。Java 的 Executors.newCachedThreadPool() 线程池就使用了它。 DelayQueue: - 底层结构:一个支持延时获取元素的无界阻塞队列。 - 特点: - 延时:队列中的元素只有在其指定的延迟时间到了之后,才能被消费者 take 出来。 - 元素类型:存入的元素必须实现 Delayed 接口(该接口又继承了 Comparable)。 - 应用场景:非常适合实现定时任务、缓存过期等功能。 应用场景:线程池,消息中间件,系统日志,消费者生产者
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP