计算机网络(三)传输层
TCP三次握手 TCP头部有哪些字段 TCP头部字段主要有源端口号、目的端口号、序列号、确认应答号、控制位:SYN、ACK、FIN、RST、头部长度、窗口大小,校验和、紧急指针、可扩展的选项这些。 源端口号和目的端口号是16位大小,源端口是发送方使用的端口号,目的端口是接收方使用的端口号,端口的作用是标识TCP连接是哪个进程的。 序列号和确认应答号都是32位大小,序列号可以保证数据的有序性,接收方会按照发送方顺序发送的数据来组装有序的...
计算机网络(二)HTTP
HTTP HTTP协议的特点是什么? HTTP具有简单、灵活可扩展、无状态等特点,是一种广泛应用于Web通信的协议。 基于文本:HTTP的消息是以文本形式传输,易于阅读和调试。 可扩展性:HTTP协议本身不限制数据的内容和格式,可以通过扩展头部、方法等来支持新的功能。 灵活性:HTTP支持不同的数据格式(如HTML、JSON、XML等),适用于多种应用场景。 请求应答模式:HTTP协议使用的是请求-应答通信模式,请求方先发起连接和请求,是主动的,而应答方只有在收到请求后才能答复,是被动的,如果没有请求时不会有任何动作。 无状态...
计算机网络(一)网络场景
网络分层模型 OSI模型和TCP/IP模型 OSI模型 物理层 负责传输比特流,定义物理介质的传输方式、电气特性等(集线器) 数据链路层 负责通过物理连接传输数据帧,提供数据的可靠传输和错误检测(网桥、交换机) 网络层与数据链路层都是基于目标地址将数据发送给接收端的,但是网络层负责将整个数据,而数据链路层则只负责发送一个分段内的数据。 网络层 数据包的路由和转发(路由器,网络层协议包括IP, 互联网控制消息协议(ICMP)) 传输层 提供端到端的数据传输服务,确保数据的可靠传输和流量控制(TCP、U...
JVM(三)类生命周期和类加载机制
类的生命周期 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。 在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定(也成为动态绑定或晚期绑定)。 另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。 加载 1....
JVM(二)垃圾回收
引用 对象的访问方式有哪些? Java程序会通过栈上的reference引用操作堆对象,访问方式由虚拟机决定,主流访问方式主要有句柄和直接指针。 句柄**:堆会划分出一块内存作为句柄池,reference中存储对象的句柄地址,句柄包含对象实例数据与类型数据的地址信息。 优点是reference中存储的是稳定句柄地址,在GC过程中对象被移动时只会改变句柄的实例数据指针,而reference本身不需要修改。 直接指针**:堆中对象的内存布局就必须考虑如何放置访问类型数据的相关信息,reference存储对象地址,如果只是访问对象本身就不需要多一次间接访问的开...
JVM(一)内存区域
运行时数据区 运行时数据区是什么 虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区,这些区域有各自的用途、创建和销毁时间。 线程私有:程序计数器、Java虚拟机栈、本地方法栈 线程共享:Java堆、方法区 运行时数据区 程序计数器 是什么:程序计数器是一块较小的内存空间,可以看作当前线程所执行字节码的行号指示器。 干什么:程序计数器主要有两个作用: 字节码解释器通过改变程序计数器来依次读取指令,从...
Java并发(六)Java线程池和Executor框架
什么是线程池?为什么要用线程池? 线程池是一种线程管理机制,它的主要作用是: 复用线程资源: 线程池会预创建一定数量的线程,并把这些线程保存在一个池子里,当需要执行任务时,可以直接复用池中的线程,避免频繁创建和销毁线程的开销 控制并发线程数: 线程池可以限制并发线程的数量,防止因为创建大量线程而导致系统资源耗尽的问题 任务排队和调度: 当所有线程都处于繁忙状态时,新来的任务会被放入一个任务队列中排队,等待有空闲线程时再执行。线程池还可以根据任务的优先级来调度执行顺序 几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地...
Java并发(五)Java原子类和并发工具类
CAS 什么是CAS CAS的全称为Compare-And-Swap,直译就是对比交换。 是一条CPU的原子指令,通过一个原子的操作,同时完成"读取内存,比较是否相等,修改内存”这三个步骤 CAS是靠硬件实现的,JVM只是封装了汇编调用,那些AtomicInteger类便是使用了这些封装后的接口. 简单解释:CAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间先比较下在旧值有没有发生变化,如果没有发生变化,才交换成新值,发生了变化则不交换。 JDK中有哪些地方用到了CAS?请列举几个 自旋锁的实现 Java原子类 ...
Java并发(四)Java并发安全容器和框架
ConcurrentHashMap和Hashtable的区别? ConcurrentHashMap和Hashtable的区别主要体现在实现线程安全的方式上不同。 底层数据结构: JDK1.7的ConcurrentHashMap底层采用分段的数组+链表实现,JDK1.8采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。 Hashtable和JDK1.8之前的HashMap的底层数据结构类似都是采用数组+链表的形式,数组是HashMap的主体,链表侧是主要为了解决哈希冲突而存在的; 实现线程安全的方式(重要): 在JDK1.7的时候,...
Java并发(三)Java中的锁
Lock Lock对比synchronized 相同点: 都用来保护资源线程安全 ReentrantLock和synchronized都具有可重入的特点 都可以保证可见性 不同点: 加解锁:synchronized加解锁由JVM实现的(内置锁),Lock的加解锁需要手动控制,通过lock()和unlock(),一般把unlock操作 放入finally块解锁。以防忘记解锁 synchronized锁只能同时被一个线程拥有,但是Lock锁没有这个限制:例如读写锁中的读锁可以同时被多个线程同时拥有 是否可以设置公平/不公平:公平锁是指多个线程在等待同一...