1. 什么是接口幂等性?
接口幂等性是指用户对于同一操作执行一次或多次得到的结果需要保证一致。主要针对修改操作而言。
样例针对订单操作时。存在场景如下:
订单系统和支付系统由于网络中段,造成支付系统在扣款成功之后并没有将消息反给订单。
解决幂等性问题
- 代码控制(存在可标识数据的唯一值,如订单系统中的订单号)
可以使用状态值,标识当前数据存在的状态,已支付,未支付,支付中等
可以使用带时间参数的版本号,用于过滤重复提交的订单 - Token校验
token机制的原理大致如下。
一。提交请求时先申请token,此时服务端记录token(这里客户端需要记录token值只申请一次)
二。 提交请求,成功后删除token并更新token
三。 后续请求如果携带旧的token则直接过滤
2. 什么是JAVA强引用
参考来源: Java基础篇 - 强引用、弱引用、软引用和虚引用
要理解java强引用,则需要了解强引用、弱引用、软引用和虚引用
强引用: 普通的引用
Object strongReference = new Object();
如果对象存在强引用,则gc不会对其进行垃圾回收。这里涉及到两个问题,
1.对于方法内的强引用,引用存在栈中,实际的对象存在堆中。当堆中数据的引用为0时,gc可进行回收
2. 对于全局变量的强引用,需要手动设置为null
软引用:设置成软引用之,jvm会在内存不足的时候首先设置软引用对象为null,然后通知gc回收它。
// 强引用
String strongReference = new String("abc");
// 软引用
String str = new String("abc");
SoftReference<String> softReference = new SoftReference<String>(str);
// 设置软引用
ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
String str = new String("abc");
SoftReference<String> softReference = new SoftReference<>(str, referenceQueue);
jvm 会在outOfMemory之前回收软引用对象,且会尽量回收那些长时间不使用的对象,尽量保存新创建的对象,同时软引用引入了ReferenceQueue对象用于存放回收的对象
软引用适用的场景为,当对象消耗内存比较大时,长期保存在内存中显然不适合。但再一定时间内希望对其进行复用。这时候保存为软引用,在内存充足时可直接引用,内存不足时进行回收,需要时重新构建
弱引用: 相对于软引用,进行gc时弱引用不论内存是否充足都会被回收,同样这里有一个ReferenceQueue用于存放回收的数据。
String str = new String("abc");
WeakReference<String> weakReference = new WeakReference<>(str);
str = null;
可以将弱引用转为强引用
// 弱引用转强引用
String strongReference = weakReference.get();
需引用: 主要用来跟踪对象垃圾回收,一定要和队列一起使用
String str = new String("abc");
ReferenceQueue queue = new ReferenceQueue();
// 创建虚引用,要求必须与一个引用队列关联
PhantomReference pr = new PhantomReference(str, queue);
2. 什么是ThreadLocal
ThreadLocal是一个数据结构有点像HashMap,可以存储key-value数据,但是只有保存一个数据。并且各个线程的数据互相不干扰
ThreadLocal 内部有一个静态类ThreadLocalMap,用于记录set的值
// 假如设置两个ThreadLocal对象,则这两个对象分别存储在ThreadLocalMap的不同位置
ThreadLocal<A> sThreadLocalA = new ThreadLocal<A>();
ThreadLocal<B> sThreadLocalA = new ThreadLocal<B>();
ThreadLocalMap 中Entry 的key是ThreadLocal弱引用,如果gc时被回收变为null,可能会是value永久存在造成内存泄漏
如果需要使子线程使用父线程的变量可以使用InheritableThreadLocal ,但是当时候线程池复用线程的时候会有问题,可以使用阿里开源的TransmittableThreadLocal 组件解决
使用场景: 当数据是已线程做为作用域时,并且不同线程要有不同的数据时可以考虑使用
什么是TCP三次握手和四次挥手?
图片出处TCP的三次握手与四次挥手理解
从图片可以直观的看出整个tcp连接的处理过程,这里想一下为什么要进行三次握手而不是两次呢。
(1)确定数据发送的初始序列号
(2)保证双方连接的确认。即如果采用2次握手,服务端发送应答后没有再接收到客户端信息,服务端就无从得知客户端是否接收到应到并且准备好数据传输。
四次挥手:
这里为什么要进行四次挥手,是由于第一次服务端应答是为了回应客户端请求,但服务端并不一定立即断开客户端连接。等服务端所有数据处理完成之后在告知客户端可以断开了。 客户端最后2MSL的等待时间是为了防止网络通讯过程中的数据丢失。如果server段没有收到最后客户端的ack,会重复发送fin,客户端接收到fin后重新发送ack,并等待2msl时间
什么是socket套接字
图片出处Socket原理讲解
socket 就是用户进程与网络协议TCP/IP之间的一种接口。应用系统只需要通过简单的代码,就可以网络不同网络应用之间的通讯。
明白了socket的,那我们在理解网络I/O的时候就更容易理解其概念。