背景最近在做一个项目(HttpDNS),简单说其中一个流程,客户端通过DNS协议构造好UDP包发给Akamai DNS Server,每个包都会带一个ID,做过网络通讯开发的同学应该都知道它的用处,把req和resp做关联映射,防止串包。那么在DNS协议里面有个限制,ID的大小不能超过65535,不然会报错误“DNS message ID 65536 is out of range”,那么ID只能
  • arick
  • 2020-06-02 16:43:41
Java中CAS原理详解前言在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁。锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制,但是vo
  • arick
  • 2019-11-16 23:56:01
维基百科:领域模型可以被看作是一个系统的概念模型,用于以可视化的形式描述系统中的各个实体及其之间的关系。领域模型记录了一个系统中的关键概念和词汇表,显示出了系统中的主要实体之间的关系,并确定了它们的重要的方法和属性。因此,对应于用例所描述的动态视图,领域模型提供了一种对整个系统的结构化的视图。领域模型的一个好处是描述并限制了系统边界。领域模型的语义可以被用在源代码中,因此领域模型可以被应用在底层的
  • arick
  • 2020-04-06 16:28:55
如果想了解 redis 与Memcache的区别参考:Redis和Memcache的区别总结阿里的面试官问问我为何redis 使用跳表做索引,却不是用B+树做索引因为B+树的原理是 叶子节点存储数据,非叶子节点存储索引,B+树的每个节点可以存储多个关键字,它将节点大小设置为磁盘页的大小,充分利用了磁盘预读的功能。每次读取磁盘页时就会读取一整个节点,每个叶子节点还有指向前后节点的指针,为的是最大限度
  • arick
  • 2020-05-14 14:28:31
分布式事务——消息最终一致性方案前言分布式事务一直是服务化拆分后一个绕不开的话题,原来在单体应用中执行的多个逻辑操作,现在被拆分成了多个服务之间的远程调用。虽然服务化为我们的系统带来了水平伸缩的能力,然而随之而来挑战就是分布式事务问题,多个服务之间使用自己单独维护的数据库,它们彼此之间不在同一个事务中,假如A执行成功了,B执行却失败了,而A的事务此时已经提交,无法回滚,那么最终就会导致两边数据不一
  • arick
  • 2019-09-24 22:10:32
如果某一个资源被多个线程共享,为了避免因为资源抢占导致资源数据错乱,我们需要对线程进行同步,那么synchronized就是实现线程同步的关键字,可以说在并发控制中是必不可少的部分,今天就来看一下synchronized的使用和底层原理。一、synchronized的特性1.1 原子性所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。在Java中,
  • arick
  • 2020-06-03 02:50:26
实现单机的百万连接,瓶颈有以下几点:如何模拟百万连接突破局部文件句柄的限制突破全局文件句柄的限制在linux系统里面,单个进程打开的句柄数是非常有限的,一条TCP连接就对应一个文件句柄,而对于我们应用程序来说,一个服务端默认建立的连接数是有限制的。如何模拟百万连接如上图所示,当服务端开启一个端口,客户端去连接,除去固定的端口,最多只能实现单机6W的连接,实现单机百万连接,最简单的方法,就是启动十几
  • arick
  • 2020-08-08 01:33:55
首先看一下题目描述:给出一个链表,每k个节点一组进行翻转,并返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么将最后剩余节点保持原有顺序。示例:给定这个链表:1->2->3->4->5当k=2时,应当返回:2->1->4->3->5当k=3时,应当返回:3->2->1->4->5说明:你的算法只能使用常数的额外空间。你不能只是单纯的改变节点内部的值,而是
  • admin
最近在做一个Map数据结构转换为指定Class类型实例的工具,涉及了大量反射相关的操作。借这个机会,整理下这方面的知识。Java JDK从1.5开始引入泛型这个概念,在这之前只有原始类型而没有泛型。泛型实现了参数化类型的概念,使代码可以应用于多种类型。泛型这个术语的意思是指:“适用于许多许多类型“。但是Java这种泛型仅仅存在于编译阶段,在JVM运行的过程中,泛型相关信息将会被擦除。所以泛型只是J
  • arick
  • 2020-01-20 04:58:03
corePoolSize:核心池的大小,这个参数跟后面讲述的线程池的实现原理有非常大的关系。在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程
  • arick
  • 2020-03-26 17:41:58
Rick ©2018