webSocket简介
WebSocket是一种应用协议,在TCP协议之上为通信双方提供双向全双工通信,在WebSocket应用中,服务器需要发布一个WebSocket端点,客户端使用这个端点的URI来连接服务器,在建立连接之后,WebSocket协议是对称的,客户端和服务器可以在连接打开的任何时间相互发送消息,而且可以在任何时间关闭连接。WebSocket解决了HTTP不适合实时通信的不足之处。
客户端总是只能连接到一个服务器,而服务器可以接受多个客户端的连接
ChannelHandler主要是为了处理入站和出站数据的逻辑,netty中提供了多个接口
ChannelInboundHandler入站接口和ChannelOutboundHandler出站接口
ChannelInboundHandler入站表示数据是从远程主机到用户应用程序,处理进站数据和所有状态更改事件
ChannelOutboundHandler出站是指从用户应用程序到远程主机,处理出站数据,允许拦截各种操作
为了使数据从一端到达另一端,一个或多个ChannelHandler将以某种方式操作数据,这些Channel会添加到ChannelPipeline中,并按照被添加的顺序进行执行
1 | * I/O Request |
1 | public interface ChannelInboundHandler extends ChannelHandler { |
在java.util.concurrent.atomic包下提供了很多原子操作类,多个线程执行一个操作时,其中任何一个线程要么完全执行此操作,要么没有执行此操作的任何步骤,其内部使用的CAS操作 乐观锁
以AtomicInteger为例
1 | public class AtomicInteger extends Number implements java.io.Serializable { |
JVM会根据处理器的特性适当的重新排序机器指令,使机器指令更符合CPU的执行特点,最大限度的发挥机器的性能,但是会导致执行顺序可能会与代码顺序不一致
在Servlet3.0版本中引入了异步处理的功能,使线程可以返回到容器,从而执行更多的任务
使用AysncContext来进行异步操作
1 | public interface ServletRequest { |
要在servlet上启用异步处理,需要配置asyncSupported为true
ConcurrentMap接口是线程安全的Map接口,ConcurrentHashMap是HashMap的线程安全版本,ConcurrentSkipListMap是TreeMap的线程安全版本
在JDK7的时候是将ConcurrentHashMap采用分段锁,将一个整体分为16段HashTable,每个段是一个Segment,提高了并发度;JDK8取消了Segment分段结构,改成了与HashMap一样的数组+链表+红黑树,实现对每一段数据进行加锁,也减少了并发冲突的概率
在jdk8之前concurrentHashMap使用该对象进行分段加锁,降低了锁的粒度,使得并发效率提高,Segment本身也相当于一个HashMap,Segment包含一个HashEntry数组,数组中每个HashEntry既是一个键值对,又是一个链表的头节点