2020-12-28

一、Json简介
javascript提供的一种数据交换格式;
1、{ }是一个对象,其中属性名必须使用双引号括起来,其值可以是null,数值字符串等;
2、四种JSON解析工具
json-lib:最早出现的接送解析工具,但是依赖较多的第三方jar包,最后的更新的时间为2010年,不推荐使用;
json:需要jar包jackson-core.jar以及jackson-mapper.jar
objectMapper mapper = new objectMapper()//objectMapper是json的核心,所有的操作都需要
mapper.writeValueAsString(object):转换为json,其中,object可以是对象,list或者map;
Gson:目前功能最全的Json解析器,需要jar包gson-2.8.0.jar
Gson gson = new Gson();
gson.toJson(object):其中object可以是一个对象,对象的list或者map;
其中fromJson(str,Class)可以将json字符串转变为java对象;
FastJson:阿里开源框架,需要fastjson.jar包
JSON.toJSONString(object);
二、Servlet基础
servlet是JavaWeb三大组件之一,相当于服务器的处理员,每个Servlet都是唯一的,处理不同的请求,tomcat相当于分发员,将不同的请求发送给不同的servlet。
1、实现servlet的三种方式(下面3个是层层封装的关系)
实现javax.servlet.Servlet接口:需要重写接口中的init()、destory()以及service()方法;
继承javax.servlet.GenericServlet类:重写service()方法即可;
继承javax.servlet.http.HttpServlet类:主要的途径,重写doGet与doPost方法即可;
2、servlet三个生命周期方法
init():在servlet生成之后调用,只能有一次;
destory():在setvlet被销毁前使用,只一次;
service():每次请求则调用该方法,可用多次;
3、servlet使用
需要在web.xml文件中配置与
4、ServletConfig介绍
一个ServletConfig对象,对应一段web.xml中servlet的配置信息。通过getServletConfig()方法来获取。其中ServletConfig.getServletContext()方法十分有用。
注:web服务器根目录下的文件可以被外界所访问,WEB-INF目录下的文件外界无法直接访问,由web服务器负责调用;
5、servlet细节
默认情况是servlet第一次被请求时创建。可以通过配置web.xml下的load-on-startup参数来指定servlet的启动顺序;节点值为负数时,即为默认情况;大于或者等于0时,则是在启动服务器时,创建此servlet,并且数值越小越早创建;
一个servlet可以对应多个
三、线程同步(三)
1、同步阻塞
线程可以通过调用同步方法获得java对象的锁,除此之外,还可以通过进入一个同步阻塞来获得锁。
在这里插入图片描述

2、监视器概念
a.监视器是不需要程序员考虑如何加锁的情况下,保证多线程的安全性。监视器有以下特性:
监视器是只包含私有域的类;
每个监视器类的对象有一个相关的锁;
使用该锁对所有的方法进行加锁。换句话说,如果客户算调用obj.method(),那么obj对象的锁是在方法调用开始时自动获得,并且在方法返回时自动释放该锁。
该锁可以有任意多个相关条件;
b.也就是,监视器就是java中每个对象有一个内部的锁和内部的条件。如果一个方法用synchronized关键字声明,那么它就是一个监视器方法。
3、Volatile域
a.使用现代的处理器和编译器,很有可能会出错:
多处理器的计算机在寄存器或本地内存缓冲区保存内存中的值。运行在不同处理器上的线程可能在同一个内存位置取到不同的值;
编译器可以改变指令执行的顺序使吞吐量最大化。这种变化可能会导致内存的值被其他线程改变;
b.同步格言:“如果向一个变量写入值,而这个变量接下来可能会被另一个线程读取;或者,从一个变量读值,而这个变量可能是之前被另一个线程写入的,此时必须使用同步”。
c.volatile关键字为实例域的同步访问提供了一种免锁机制。如果声明一个域是volatile,那么编译器和虚拟机就知道该域可能被另一个线程并发更新的。为了避免synchronized带来的阻塞,可以将需要同步的域声明为volatile;
注:线程安全的三大性质
原子性
一个操作是不可中断的,要么全部成功,那么全部失败。在java中只有对基本类型变量的赋值和读取是原子操作。例如j=i这样的操作不是原子操作,它进行了多次原子操作,比如先读取i的值,再将i的值赋值给j,两个原子操作加起来就不是原子操作了。synchronized关键字满足原子性,volatile不满足原子性,想要让volatile满足原子性,必须符合以下两条规则:1.运算结果并不依赖于变量的当前值,或确保只有一个线程修改变量的值;2.变量不需要与其他的状态变量共同参与不变约束;
有序性
为了性能优化,编译器和处理器会进行指令重排序。单线程中,所有操作都是有序的;在另一个线程中观察另外一个线程,所有的操作都是无序的。
在这里插入图片描述

如上图,若2和3进行了重排序的话,线程B的判断if(instance==null)就会为true,而实际上这个instance并没有初始化成功,而对于线程B来说操作就是错的。而使用volatile修饰的话就可以禁止2和3操作重排序,从而避免这种情况。所以,volatile和synchronize关键字都是保证了有序性的。
可见性
指当一个线程修改了共享变量之后,其他线程能够立即得知这个修改。synchronized和volatile都具有可见性;
4、final变量
当一个域声明为final时,可以安全地访问一个共享域,其他线程会在构造函数完成构造之后才看到这个变量(针对于可见性提出的一种解决方案)。当然对于这个映射表的操作并不是线程安全的。如果多个线程在读写这个映射表,仍然需要进行同步操作。
5、原子性
对共享变量除了赋值之外并不完成其他操作,那么可以将这些共享变量声明为volatile;
java.concurrent.atomic包中的许多类使用高效的机器级指令(而不是锁)来保证其他操作的原子性。例如,AtomicInteger类提供了方法incrementAndGet,以原子方式将一个整数自增或自减,也就是说获得值、增1并设置然后生成新值的操作不会被中断,保证多个线程并发地访问同一个实例,也会计算并返回正确的值;
如果更新的数值是与其他数值比较后再更新的,那么就需要使用CompareAndSet方法。如果另一个线程也在更新该变量,就会阻止这个线程更新。CompareAndSet方法会放回false,而不会设置新值。这个方法会映射到一个处理器操作,比使用锁速度更快。在java8中,可以使用lambda表达式来更新变量;
在这里插入图片描述
在这里插入图片描述

如果大量线程访问相同的原子值,性能会大幅下降,因为乐观更新需要太多次重试。此时,可以使用LongAdder和LongAccumulator类来解决问题(出现与jdk1.8中,可以替代atomiclong的存在)。LongAccumulator是LongAdder的功能增强版。LongAdder的API只有对数值的增加,而LongAccumulator提供了自定义的函数操作。当多个线程更新不同的加数,LongAdder可以包括这些变量,其总和为当前值;
在这里插入图片描述

6、死锁
所有的线程被阻塞的状态被称为死锁。死锁的现象不能通过java编程来解决,必须要仔细设计程序来确保不会出现死锁。
7、线程局部变量
使用ThreadLocal辅助类为各个线程提供各自的实例来避免线程间共享变量的风险。
8、锁测试与超时
线程在调用lock方法来获得另一个线程所持有的锁的时候,很有可能发生阻塞。tryLock方法视图申请一个锁,在成功获得锁后返回true,否则,立即返回false,而且线程可以立即离开去做其他事情。此外,调用tryLock时,可以使用超时参数。
注:Java中的中断与操作系统中的中断有所不同。java中线程中断只是一个状态,设置线程中断不影响线程的继续执行(由该线程决定是否响应这个信号),但是线程设置中断后,线程内调用了wait、join、sleep方法中的另一个会立马抛出一个InterruptedException,且中断标志被清除。
9、读/写锁(ReentrantReadWriteLock)
适用于很多线程从一个数据结构读取数据而很少线程修改其中的数据。这种情况下,允许读线程共享访问,写线程互斥访问。
ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private Lock readLock = rwl.readLock();
private Lock readLock = rwl.writeLock();
然后对读/写方法加上对应的锁即可。
四、HTTP与HTTPS
1、HTTP与HTTPS的区别
HTTPS解决HTTP不安全的缺陷,在表示层中加入了SSL/TLS安全协议,使报文加密传输;
HTTPS在TCP三次握手之后,还需要进行SSL/TLS握手过程;
HTTP端口是80,HTTPS端口是443;
2、HTTPS解决了什么问题?
信息加密:交互信息无法被窃取;
混合加密(对称加密和非对称加密):通信建立前采用非堆成加密交换会话秘钥,在通信过程中全部采用对称加密的会话秘钥的方式加密明文数据;
对称加密:加密、解密使用过的是同一串秘钥;运算速度快,但秘钥必须保密;
非对称加密:加、解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息只有私钥才能解密,反之亦然;解密速度慢,但安全性更好,使用于数据量较小的情况;
校验机制:无法篡改通信内容,篡改了就不能正常显示;
摘要算法:实现完整性,能够为数据生成独一无二的指纹,用于校验数据的完整性,避免篡改的风险;
客户端在发送明文之前会通过摘要算法算出明文的摘要内容,发送的时候把指纹+摘要一同加密成密文后发送给服务器,服务器解密后,使用相同的摘要的算法计算发送过来的明文,通过客户端携带的摘要进行比较。如果两者相同,说明数据是完整的。
身份证书:确保你访问的页面的正确性
为保证客户端向服务器索要的公钥不被篡改,需要第三方权威机构CA将服务器公钥放在数字证书中,只要证书是可信的,公钥就是可信的。
3、HTTPS是如何建立连接的?
SSL/TLS协议基本流程:
客户端向服务器索要并验证服务器的公钥;
双方协商产生会话秘钥;
双方采用会话秘钥进行加密通信;
前两步也就是SSL/TLS的建立过程,也就是握手阶段,握手阶段一共涉及四次通信,
SSL/TLS协议建立的详细流程:
客户端向服务器发起加密通信请求,带上客户端SSL/TLS协议版本、生成的随机数以及密码套件列表;
服务器向客户端发出响应,带上确认的SSL/TLS版本协议信息、生成的随机数、确定的密码套件列表以及服务器的数组证书;
客户端确定数字证书的真实性并获取公钥。产生另一个随机数用服务器公钥加密,并且进行加密通信算法改变通知,最后是客户端握手结束通知并生成本次通信的会话秘钥;
服务器接收第二个随机数后,通过客户端随机数+服务器随机数+客户端第二个随机数计算出本次通信的会话秘钥,并且发出加密通信算法改变通知与握手结束通知。
五、HTTP/1.1、HTTP/2、HTTP/3演变
1、HTTP/1.1的性能瓶颈
只能压缩Body部分,请求/响应头未经压缩就发送;
每次互相发送相同的首部造成的浪费较多;
服务器按照请求的顺序响应,容易产生队头阻塞;
没有请求优先级控制;
请求只能从客户端开始,服务器只能被动响应;
2、HTTP/2优化措施
头部压缩
首先会压缩头,此外使用HPACK算法在客户端和服务器同时维护一张头信息表,所有字段都存入这张表,生成一个索引号。通过发送索引号来帮忙消除重复的部分并且提高速度。
二进制格式
头信息和数据体不再是纯文本形式的报文,而是全面采用二进制格式,并且统称为帧:头信息帧和数据帧。这样服务器无需将明文转换为二进制,增加了数据传输的效率。
数据流
HTTP/2的数据包不是按照顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。
每个请求或回应的所有数据包被称为一个数据流。客户端可以指定数据流的优先级。优先级高的请求,服务器优先响应。
多路复用
HTTP/2可以在一个连接中并发多个请求或回应,而不同按照顺序一一对应。移除了串行请求,无需排队等待,不会出现队头阻塞的问题,降低了延迟,大幅度提高了连接的利用率。
服务器推送
服务器不再是被动地响应,也可以主动向客户端发动消息。例如浏览器刚刚请求HTML的时候就可以提前将JS等其他静态资源主动发送给客户端,减少延迟的等待。
3、HTTP/2的缺陷
多个HTTP请求在复用一个TCP连接,下层的TCP协议是不知道有多少个HTTP请求的。因此一旦发生了丢包现象,就会触发TCP的重传机制,这样在一个TCP连接中的所有的HTTP请求都必须等待这个丢了的包重传回来,从而阻塞所有的HTTP请求。
4、HTTP/3的优化(普及的进度很缓慢)
HTTP3把HTTP下层的TCP协议改成了UDP。
为了解决UDP是不可靠传输的问题,使用了基于UDP的QUIC协议去实现类似TCP的可靠性传输
QUIC有自己的一套机制保证传输的可靠性。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响;
QUIC将TCP+TLS的6次交互合并成了3次,减少了交互次数;
注:a.SSL/TLS是一个东西在不同时期的叫法;
b.SSL/TLS1.2需要握手4次,而SSL/TLS1.3优化了过程,只需要3次握手即可;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值