Skip to content

Java编程之美 笔记

tasks
not done
path includes Java编程之美 笔记

异常

感触的内容

  • 异常的处理方式参考原则:函数只抛出与业务逻辑相关的异常,对于调用者不关心的异常应该内部消化
  • 异常在处理的时候,要么被抛出,要么被记录,不能同时抛出与记录
  • 创建异常时,会对当前的函数调用栈拍一个快照,如果函数调用栈很深,那么这个拍照的时间就很长,尤其是在递归函数中
  • 抛出异常时,会弹出栈帧,并在栈帧中查看是否存在对应的异常处理。

相关问题

  • 异常调用栈信息中,“…2 more”和 “… 3 more”具体指的是什么内容?

IO类

感触的内容

  • Java的IO流设计,将整个设计分为字节流,和字符流,但是IO设备的操作是统一的,打开,关闭,读取,写入。仅仅只是对字节的解读方式不同而已。所以我认为完全可以只设计一个字节流,所有有关字符的操作都利用装饰器设计模式来进行实现并增强。

相关问题

  • 网络编程中,具体的OutputStream 以及InputStream到底是什么对象呢?
  • 为什么把IO看做“流”

NIO

感触的内容

  • 感受到了组合优于继承的威力
  • 同步于异步的区别在于,是不是自己在查看状态,如果是自己查看状态即为同步,如果是别人通知即为异步。而同步按照查看状态的方式分为,阻塞和非阻塞。阻塞就是傻等状态,即一直看着状态。而非阻塞就是查看状态就休息一会,玩一会,然后再去查看状态。

相关问题

  • java.io提供了BufferedInputStream、BufferedOutputStream,用于支持缓存的文件读写,那么,类似功能,java.nio是如何实现的呢?

高速I/O

感触的内容

  • 普通的文件读写的方式,无论是读还是写,都需要复制两次数据,存在没有必要的复制操作
  • 提高普通文件的读写方式有两种,一种是mmap内存映射文件,一种是zero-copy零拷贝技术。mmap技术主要用于文件的读写,而零拷贝技术主要用于数据在IO设备之间的流转。

相关的问题

  • 既然DMA技术能给CPU"减负",那么,为什么不让它也负责内核缓冲区到应用程序缓存区之间的数据拷贝呢?这样减负效果不是更好?
    • 我认为还是因为应用程序缓冲区由应用程序控制,交给DMA不太好
  • mmap主要用于文件读写,那么为什么网络读写不能使用mmap技术呢?

泛型

感触的内容

  • 我认为extends这个关键字的作用太多了,既可以用于类的继承,也可以用用于在限定类型参数的时候的类型范围,还可以用于限定通配符的类型范围

相关的问题

  • 验证点:类型参数不可以extends 或者 super类型参数
  • 验证点:看看通配符 ? super XXX 的字节码

动态代理

  • 动态代理的优点:减少代理类的编写,可以复用额外增强的逻辑
  • 动态代理基本流程:生成动态代理类的字节码,将字节码加载到JVM中,生成对应的代理类对象

感触的内容

  • 只要是人写的代码,你就有机会看看它是如何实现的

相关的问题&待做的事情

  • 可以自己研究一下动态代理的源码

函数式编程

感触的内容

  • 面向过程编程以函数为组织代码的基本单元,面向对象编程以类和对象为组织代码的基本单元,面向函数编程以无状态函数为组织代码的基本单元
  • 每种编程范式都有自己擅长的领域,只不过面向对象编程比较通用而已。

相关的问题&待做的事情

  • Java中的方法引用的语法 对象::实例方法,类::静态方法,类::实例方法有什么区别?


线程概述

感触的内容

  • 操作系统就像一个工人,我们的程序就像一个一个的任务,工人接受到任务,然后开始执行任务,如果在规定的时间内没有完成,那么就会切换另外一个任务继续做。在切换的时候,需要整理工作台,记录任务的进度等等。

相关问题&待做的事情

  • 除了进程上下文切换,线程上下文切换,系统调度导致的内核态和用户态的上下文切换,你还能想到有哪些其他的上下文切换?答:我认为只要是涉及到系统调用的都会发生上下文切换 ✅ 2025-02-01
  • 如果N个线程运行在N个CPU,是否还会有线程切换呢?答:我认为是有的,比如某个线程需要等待某些资源,或者某个线程依赖另一个线程的东西 ✅ 2025-02-01

线程模型

  • 不同的线程模型的主要区别在于线程调度由谁来完成?是操作系统内核,还是语言的运行时。

感触的内容

  • 计算机底层的领域知识真的很重要,而我在大学期间学的计算机底层知识又乱又理论,只懂点皮毛,对于具体的细节完全不懂。所以我现在的任务就是补底层,先看混沌学堂梳理出整个计算机的主脉,然后针对自己的薄弱点以及急切需求的点深入学习。

相关问题&待做的事情

  • 对操作系统的理解还是太薄弱了,和没学一样.
  • 本节讲到了1:1模型,M:1线程模型,M:N线程模型,那么是否可以设计一种1:N线程模型呢?为什么?答:我认为可以但是没有必要,我们可以将一个用户线程类比成一个任务,内核线程类比成工人,一个任务需要多个人执行,如果这个任务可以拆分,而且是无依赖的拆分那么并发执行可以提高效率,如果这个任务不可以被拆分,或者拆分之后存在上下依赖,那么不仅没能提高效率,反而浪费了内核线程。 ✅ 2025-02-01

JMM

  • 并发编程在提高效率的同时,会引入三个问题,可见性问题,有序性问题,原子性问题
  • Happen Before的规则只是保证了我们期望的结果与最终结果的一致性,但是并没有保证运行过程与Happen Before规则规定的一样。

感触的内容

相关问题&待做的事情

  • 为什么volatile禁止指令重排序,选择的部分禁止指令重排序,写操作与前面的读写操作不能重排序,而读操作与后面的读写操作不能重排序
  • 并发编程这一块的内容,需要慢慢品味。!!!