Java知识点
HTTP的三次握手和四次挥手
HTTP请求建立连接步骤
三次握手(两次确认):
- 客户端向服务器发出请求连接报文。
- 服务收到请求报文后,如果同意,则发出确认报文。
- 客户端收到服务器确认之后,再向服务器给出确认,此时客户端进入established(已建立连接)状态。
- 当服务器收到客户端确认请求之后,服务器就进入established(已建立连接)状态,双方可以开始通信。
HTTP请求释放连接(四次挥手)
- 客户端发出连接释放报文,停止发送数据,客户端进入fin-wait-1(终止等待1)状态。
- 服务器收到连接释放报文,发出确认报文,服务端进入了close-wait(关闭等待)状态。
- 客户端收到服务器的确认请求之后,客户端进入了fin-wait-2(终止等待2)状态。
- 服务器将最后的数据发送完毕后,向客户端发送连接释放报文,服务器进入last-ack(最后确认)状态
- 客户端收到服务器的连接释放报文后,必须发出确认,客户端进入了time-wait(时间等待)状态
- 服务器只要收到了客户端发出的确认,进入close状态。
synchronized与Lock的区别
用法区别
synchronized可以修改的作用域如下:
① 非静态方法(加的锁为对象锁)
② 静态方法(加的锁为类锁)
③ 代码块(对象锁与类锁均可)
Lock采用lock()对代码进行加锁,unlock()进行解锁
状态区别
① lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现。
② synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生。(所以最好将同步代码块用try catch包起来,finally中写入unlock,避免死锁的发生)。
③ lock等待锁过程中可以用interrupt来中断等待,而synchronized只能等待锁的释放,不能响应中断。
④ Lock可以通过trylock来知道有没有获取锁,而synchronized不能。
机制区别
① synchronized原始采用的是CPU悲观锁机制,即线程获得的是独占锁,独占锁意味着其他线程只能依靠阻塞来等待线程释放锁。
② lock用的是乐观锁的方式,乐观锁就是每次不加锁,而是假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就是CAS操作。
是每次不加锁,而是假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就是CAS操作。