JAVA基础
2023-12-04 17:52:12 0 举报
AI智能生成
登录查看完整内容
java
作者其他创作
大纲/内容
HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立TCP连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求
缺点:连接无法复用;head of line blocking
HTTP1.0
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
状态码
在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟
默认持久链接
客户端可以同时发送多个HTTP请求,而不用一个个等待响应
管线化
客户端记录本次需要续传的片断,并在需要续传时通知服务器本次需要下载的内容片断,实现断点续传功能
断点续传原理
HTTP1.1
多路复用 (Multiplexing);二进制分帧;首部压缩;服务端推送
HTTP2.0
HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息(TSL/SSL协议)。
HTTPS
浏览器输入url到返回页面的全过程
DNS解析域名的过程
超链接
HTTP
是无连接的,尽最大可能交付,没有拥塞控制,面向报文,支持一对一、一对多、多对一和多对多的交互通信。
首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和
用户数据报协议 UDP
是面向连接的,提供可靠交付,有流量控制,拥塞控制,提供全双工通信,面向字节流,每一条 TCP 连接只能是点对点。TCP头部有20个字节。
1.数据包丢失;2.确认应答丢失
超时重传
快速重传
SACK
D-SACK
重传机制
避免TCP每发一次数据就要进行确认应答的低效率
窗口大小(接收方确定)就是指无需等待确认应答,而可以继续发送数据的最大值。
窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。
接收窗口的大小是约等于发送窗口的大小的
滑动窗口
操作系统缓存区与滑动窗口的关系
窗口关闭
糊涂窗口综合征
流量控制
慢启动
拥塞避免
超时重传/快速重传
拥塞发生
快速恢复
堵塞控制
传输控制协议 TCP
TCP/UDP
与网络相关的程序通过网络与其他程序通信使用的数据格式规范。
HTTP(80端口),主要用于普通浏览。
HTTPS(443端口),HTTP协议的安全版本。
FTP(20和21端口),用于文件传输。
POP3(110端口),收邮件用。
SMTP(25端口),用来发送电子邮件。
SSH(22端口),用于加密安全登陆用。
DHCP(67端口,动态主机配置协议),动态配置IP地址。
DNS,用于完成地址查找,邮件转发等工作(运行在TCP和UDP协议上)。
ARP,用于动态解析以太网硬件的地址。
应用层
解决诸如端到端可靠性(数据是否已经到达目的地)和保证数据按照正确的顺序到达这样的问题。TCP、UDP都是传输层协议。
传输层
解决在一个单一网络上传输数据包的问题。IP协议是网络层协议。
网络层
数据包从一个设备的网络层传输到另外一个设备的网络层遵循的规范。比如以太网协议、Wi-Fi协议
数据链路层
四层模型
网络模型
计算机网络
内部维护了一个普通对象Map,还有排斥锁mutex
synchronizedMap
java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改
快速失败(fail—fast)
java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改
安全失败(fail—safe)
内部进行了 Segment 分段,Segment 继承了 ReentrantLock,各个 Segment 之间都是相互独立上锁的,互不影响
JDK1.7
数组 + 链表 + 红黑树,采用 Node + CAS + synchronized 保证线程安全
JDK1.8
ConcurrentHashMap初始化方法
只能有一个线程参与初始化过程,其他线程必须挂起
构造函数不做初始化过程,初始化真正是在put操作触发
sizeCtl < 0 表示正在进行初始化,线程挂起
初始化步骤完成后,设置sizeCtl = 0.75 * n(下一次扩容阈值),表示下一次扩容的大小
步骤
initTable
根据hash值计算节点插入在table的位置,如果该位置为空,则直接插入,否则插入到链表或者树中
真实情况较为复杂
核心思想
根据 key 计算出 hashcode
table为null,线程进入初始化步骤,如果有其他线程正在初始化,该线程挂起
如果插入的当前 i 位置 为null,说明该位置是第一次插入,利用CAS插入节点即可,插入成功,则调用addCount判断是否需要扩容。若插入失败,则继续匹配(自旋)
若该节点的hashcode ==MOVED(-1),表示有线程正在进行扩容,则进入扩容进程中
其余情况就是按照链表或者红黑树结构插入节点,但是这个过程需要加锁(synchronized)
put
table ==null ;return null
从链表/红黑树节点获取
get
多线程扩容
构建一个nextTable,其大小为原来大小的两倍,这个步骤是在单线程环境下完成的
将原来table里面的内容复制到nextTable中,这个步骤是允许多线程操作
扩容
所在链表的元素个数达到了阈值 8,则将链表转换为红黑树
红黑树算法
链表转换为红黑树过程
重要操作
ConcurrentHashMap
Java并发集合
对象序列化的机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型
将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化
整个过程都是 Java 虚拟机(JVM)独立的
概念
实现 java.io.Serializable 对象
该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须注明是短暂的
满足两个条件
ObjectOutputStream 类用来序列化一个对象
序列化并不保存静态变量
要想将父类对象也序列化,就需要让父类也实现Serializable 接口
注意
序列化对象
ObjectInputStream 类用来反序列化一个对象
反序列化对象
当某个字段被声明为transient后,默认序列化机制就会忽略该字段
transient关键字
网络传输、RMI等场景
应用
序列化
String底层为final的char数组,对象一旦生成,则不能再对它进行改变(提高多线程下的性能)
通过直接量赋值方式,放入字符串常量池
通过new方式赋值方式,不放入字符串常量池
String
线程不安全,效率高
StringBuilder
线程安全,加synchronized,效率低
StringBuffer
==比较内存地址, equal比较内存地址和值
String类
JDK 1.7 中 HashMap 是以数组加链表的形式组成的,JDK 1.8 之后新增红黑树,当链表大于 8 并且容量大于 64 时,链表结构会转换成红黑树结构(小于6退化)。
(h == hashcode()) ^ h >>16,高低16位进行异或,保留高低16位的特征,减少hash冲突
hash算法优化
h & (length-1),位运算比取模效率高
寻址方法优化
扩容期间取出的值不准确
put 碰撞导致数据丢失
可见性问题无法保证
线程不安全
resize:元素超过length*loadFactor
扩容:创建一个新的Entry空数组,长度是原数组的2倍。
ReHash:遍历原Entry数组,把所有的Entry重新Hash到新数组。
HashMap
ConcurrentHashMap
synchronized 关键字
不支持null键和值
HashTable
实现 SortedMap 接口,能够把它保存的记录根据键排序
TreeMap
保存了记录的插入顺序
LinkHashMap
Map
扩容:空间检查,1.5倍
ArrayList(数组)
Vector( 数组实现、 线程同步)
实现了List接口和Deque接口
链表,动态插入和删除
LinkedList
List
底层实现是基于HashMap
不保证Set的迭代顺序
不保证该顺序永久不变
HashSet
基于TreeMap
有序
TreeSet
Set
可以用它来实现双向队列
基于堆结构实现,可以用它来实现优先队列
PriorityQueue
Queue
Collection
集合
阻塞 IO 模型
非阻塞 IO 模型
需要复制大量的句柄数据结构,产生巨大的开销
水平触发,报告了发生事件的句柄若未被处理,下次还将上报
select/poll
EPOLLLT和EPOLLET两种触发模式
没有最大并发连接的限制,能打开的FD的上限远大于1024
效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数
epoll
多路复用 IO 模型
信号驱动 IO 模型
异步 IO 模型
Java NIO
IO
基础
0 条评论
回复 删除
下一页