• SpringBoot简单整合Netty实现一个聊天室

    SpringBoot简单整合Netty实现一个聊天室

    今天花了点时间研究下 SpringBoot 整合 Netty,因为现在公司用的框架就有 SpringBoot,感觉我现在依赖上了 SpringBoot……. 在 SpringBoot整合 Netty 的基础上实现一个聊天室这么个小东西。废话不多说直接开始。 Maven 依赖12345678910111213141516171819<dependency> <group...
  • Netty解决TCP粘包拆包的问题

    Netty解决TCP粘包拆包的问题

    什么是 TCP 粘包拆包问题?可以先想象这么一个实际场景,一条河的两岸通过船来运输货品,如果每次运输的货品太少,就先把需要运输的货品积攒起来,差不多了再一起运走,这样可以减少船来往的次数节省成本;如果每次运输的货品太多,超过了船的承重,那就把这批货分成两批或者多批运走。 这个例子的第一种情况就是 TCP 协议中的粘包,第二种是拆包。TCP协议可以理解为“船”,当然 TCP 粘包拆包的原因有很...
  • Netty 中的一些重要接口以及他们之间的关系

    Netty 中的一些重要接口以及他们之间的关系

    今天总结下 Netty 中几个很重要的接口,在学习时缕清楚他们之间的关系,自然对 Netty 的流程也就更清晰了。 主要的接口有ChannelHandler、ChannelPipeline、ChannelHandlerContext等。 ChannelHandlerChannelHandler 继承关系图: Netty是一个基于事件通知的异步通信框架,ChannelHandler就是用来处...
  • NIO的一些知识点

    NIO的一些知识点

    学习 NIO有一段时间了,今天主要总结下什么是 NIO,以及 NIO 的三大组件Buffer、Channel、Selector以及其他相关概念。 NIO传统 BIO 和 NIO最大的区别在于 NIO 是非阻塞的,阻塞和非阻塞的区别在于线程得到返回结果前是否可以做其他事情,阻塞是不可以的,非阻塞可以。 举个例子:一个餐厅里客人来了后要有服务员对客人进行服务,BIO是每来一个客人都得有一个服务员...
  • 自己动手用 Redis 撸一个分布式锁

    自己动手用 Redis 撸一个分布式锁

    什么是分布式锁?分布式锁,是控制分布式系统之间同步访问共享资源的一种方式,在分布式环境中,如果不同的系统或是同一系统的不同服务器之间共享了某些资源,那么访问这些资源的时候需要互斥防止彼此干扰,以此来保证数据一致性,由于单机环境的 Lock 和 synchronize 等锁在分布式环境中不可用,这时候需要用到分布式锁,如秒杀场景。 分布式锁特点: 高可用、高性能地获取锁和释放锁 具备锁可重入特...
  • ThreadLocal是什么鬼?

    ThreadLocal是什么鬼?

    前言之前写过一篇关于[SimpleDateFormat线程安全问题](link: http://zhengyk.cn/2017/10/31/java/Thread_sdf/)的记录博客,里面提到了使用 ThreadLocal 来保证 SimpleDateFormat 线程安全,这是一种比在每个方法里都 new SimpleDateFormat更优雅的方式,当然现在操作时间推荐使用 joda...
  • 线程池的理解、分析

    线程池的理解、分析

    前言前阵子看唯品会开发指南VJTools 关于多线程开发这块儿,在开发中,为了保护线程资源,建议不要自己创建线程,因为线程的创建和销毁是很耗费资源的操作,直接 new 再 start 可能会无限制新建线程,为了更好地管理、利用线程资源可以将一些线程进行池化,也就是线程池。 线程池线程池和连接池原理类似,其核心思想就是提前准备好一些资源放到一个池子里,大家用的时候从池子中取,不用了就放回池子还...
  • ConcurrentHashMap那些事儿

    ConcurrentHashMap那些事儿

    今天回顾总结下ConcurrentHashMap的一些东西,众所周知,HashMap 不是线程安全的,而ConcurrentHashMap 是线程安全的,所以前阵子总结完多线程的相关知识点后再分析 ConcurrentHashMap 就会轻松很多。 ConcurrentHashMapConcurrentHashMap在jdk7和jdk8中的实现是不同的。 在jdk7中 ConcurrentH...
  • 原子类 AtomicInteger

    原子类 AtomicInteger

    前言当多线程更新某个共享变量时,可能会出现非预期结果,比如i++这样的操作,解决的办法有使用synchronized 或者 Lock 锁,但这样做其实让多线程不会同时更新这个变量,虽然线程安全了,但存在效率、性能问题。 jdk1.5提供了一系列原子操作类,它们存在于java.util.concurrent.atomic包下,这些原子类具有简单、性能高效、线程安全的优点。 代码示例123456...
  • BlockingLock 阻塞队列

    BlockingLock 阻塞队列

    阻塞队列BlockingQueueBlockingQueue 是一个接口,继承自 Queue,Queue继承自 Collection 接口, BlockingQueue插入和移除的4中处理方式: 方法/处理方式 抛出异常 返回boolean 一直阻塞 超时退出 插入 add(e) offer(e) put(e) offer(e,time,unit) 移除 remov...
12345611