今天花了点时间研究下 SpringBoot 整合 Netty,因为现在公司用的框架就有 SpringBoot,感觉我现在依赖上了 SpringBoot…….
在 SpringBoot整合 Netty 的基础上实现一个聊天室这么个小东西。废话不多说直接开始。
Maven 依赖12345678910111213141516171819<dependency> <group...
什么是 TCP 粘包拆包问题?可以先想象这么一个实际场景,一条河的两岸通过船来运输货品,如果每次运输的货品太少,就先把需要运输的货品积攒起来,差不多了再一起运走,这样可以减少船来往的次数节省成本;如果每次运输的货品太多,超过了船的承重,那就把这批货分成两批或者多批运走。
这个例子的第一种情况就是 TCP 协议中的粘包,第二种是拆包。TCP协议可以理解为“船”,当然 TCP 粘包拆包的原因有很...
今天总结下 Netty 中几个很重要的接口,在学习时缕清楚他们之间的关系,自然对 Netty 的流程也就更清晰了。
主要的接口有ChannelHandler、ChannelPipeline、ChannelHandlerContext等。
ChannelHandlerChannelHandler 继承关系图:
Netty是一个基于事件通知的异步通信框架,ChannelHandler就是用来处...
学习 NIO有一段时间了,今天主要总结下什么是 NIO,以及 NIO 的三大组件Buffer、Channel、Selector以及其他相关概念。
NIO传统 BIO 和 NIO最大的区别在于 NIO 是非阻塞的,阻塞和非阻塞的区别在于线程得到返回结果前是否可以做其他事情,阻塞是不可以的,非阻塞可以。
举个例子:一个餐厅里客人来了后要有服务员对客人进行服务,BIO是每来一个客人都得有一个服务员...
什么是分布式锁?分布式锁,是控制分布式系统之间同步访问共享资源的一种方式,在分布式环境中,如果不同的系统或是同一系统的不同服务器之间共享了某些资源,那么访问这些资源的时候需要互斥防止彼此干扰,以此来保证数据一致性,由于单机环境的 Lock 和 synchronize 等锁在分布式环境中不可用,这时候需要用到分布式锁,如秒杀场景。
分布式锁特点:
高可用、高性能地获取锁和释放锁
具备锁可重入特...
前言之前写过一篇关于[SimpleDateFormat线程安全问题](link: http://zhengyk.cn/2017/10/31/java/Thread_sdf/)的记录博客,里面提到了使用 ThreadLocal 来保证 SimpleDateFormat 线程安全,这是一种比在每个方法里都 new SimpleDateFormat更优雅的方式,当然现在操作时间推荐使用 joda...
前言前阵子看唯品会开发指南VJTools 关于多线程开发这块儿,在开发中,为了保护线程资源,建议不要自己创建线程,因为线程的创建和销毁是很耗费资源的操作,直接 new 再 start 可能会无限制新建线程,为了更好地管理、利用线程资源可以将一些线程进行池化,也就是线程池。
线程池线程池和连接池原理类似,其核心思想就是提前准备好一些资源放到一个池子里,大家用的时候从池子中取,不用了就放回池子还...
今天回顾总结下ConcurrentHashMap的一些东西,众所周知,HashMap 不是线程安全的,而ConcurrentHashMap 是线程安全的,所以前阵子总结完多线程的相关知识点后再分析 ConcurrentHashMap 就会轻松很多。
ConcurrentHashMapConcurrentHashMap在jdk7和jdk8中的实现是不同的。
在jdk7中 ConcurrentH...
前言当多线程更新某个共享变量时,可能会出现非预期结果,比如i++这样的操作,解决的办法有使用synchronized 或者 Lock 锁,但这样做其实让多线程不会同时更新这个变量,虽然线程安全了,但存在效率、性能问题。
jdk1.5提供了一系列原子操作类,它们存在于java.util.concurrent.atomic包下,这些原子类具有简单、性能高效、线程安全的优点。
代码示例123456...
阻塞队列BlockingQueueBlockingQueue 是一个接口,继承自 Queue,Queue继承自 Collection 接口,
BlockingQueue插入和移除的4中处理方式:
方法/处理方式
抛出异常
返回boolean
一直阻塞
超时退出
插入
add(e)
offer(e)
put(e)
offer(e,time,unit)
移除
remov...