摘要: 系统性学习,异步IT-BLOG 一、HashMap 底层源码 JDK7 版本(数组+链表) 我们存放的 hashMap 都会封装成一个节点对象 Entry(key,value),然后将此节点对象存放到一个数组中,存放前首先需要确定存放的数组下标:① 通过 hash(key) 算法得到 key 的 h 阅读全文
posted @ 2020-11-20 00:10 Java程序员进阶 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 一、Redis 为什么那么快 【1】完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中。【2】数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的。【3】采用单线程,避免不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑各种锁 阅读全文
posted @ 2020-11-20 00:01 Java程序员进阶 阅读(85) 评论(0) 推荐(0) 编辑
摘要: 更多内容,移步IT-BLOG 一、Redis 复制 复制(Replication):是 Redis 实现高可用的基础。且在复制过程中,主节点/从节点都是非阻塞的,但是从节点在执行同步时使用的是旧数据集提供查询。 Redis 复制启动图与流程说明:​1)、当从节点连接到主节点时,会发送 psync 命 阅读全文
posted @ 2020-11-19 23:30 Java程序员进阶 阅读(176) 评论(0) 推荐(0) 编辑
摘要: 一、什么是单点登录 单点登录(Sign Sion On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。对于存在诸多子系统且子系统分别部署到不同的服务器中,那么使用传统的 session 是无法解决的 阅读全文
posted @ 2020-11-19 22:47 Java程序员进阶 阅读(826) 评论(0) 推荐(0) 编辑
摘要: 系统性学习,异步IT-BLOG CountDownLatch 是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。CountDownLatch 能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。 阅读全文
posted @ 2020-11-19 21:57 Java程序员进阶 阅读(17) 评论(0) 推荐(0) 编辑
摘要: 一、阻塞队列 【1】首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如下图所示: ​当阻塞队列为空时,从队列中获取元素的操作将会被阻塞。当阻塞队列是满时,往队列中添加元素的操作将会被阻塞。【2】在多线程领域:所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤 阅读全文
posted @ 2020-11-19 21:55 Java程序员进阶 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 系统性学习,移步IT-BLOG 线程池做的工作主要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数超过了最大数量超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。 什么是线程池 线程池(Thread Pool)是一种基于池化思想管理线程的工 阅读全文
posted @ 2020-11-19 21:16 Java程序员进阶 阅读(152) 评论(0) 推荐(0) 编辑
摘要: Java8 优势:速度快、代码更少(增加了新的语法 Lambda 表达式)、强大的 Stream API、便于并行、最大化减少空指针异常 Optional; 一、Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递) 阅读全文
posted @ 2020-11-19 19:54 Java程序员进阶 阅读(566) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG volatile 表示 “不稳定” 的意思。用于修饰共享可变变量,即没有使用 final(不可变变量) 关键字修饰的实例变量或静态变量,相应的变量就被称为 volatile 变量,如下: private volatile String name; volatile 关 阅读全文
posted @ 2020-11-19 19:52 Java程序员进阶 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往个人博客 一、通过synchronize 中的 wait 和 notify 实现 【1】我们可以将生产者和消费者需要的方法写在公共类中 1 package com.yintong.concurrent; 2 3 import java.util.LinkedList; 4 5 publ 阅读全文
posted @ 2020-11-19 19:42 Java程序员进阶 阅读(2147) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往个人博客 当说到 Netty 线程模型的时候,一般首先会想到经典的 Reactor 线程模型,尽管不同的 NIO 框架对于 Reactor 模式的实现存在差异,但本质上还是遵循了 Reactor 的基础线程模式。 一、Reactor 单线程模型 无论是C++ 还是 Java 编写的网络 阅读全文
posted @ 2020-11-19 17:36 Java程序员进阶 阅读(337) 评论(0) 推荐(0) 编辑
摘要: 一、粘包出现的原因 服务端与客户端没有约定好要使用的数据结构。Socket Client实际是将数据包发送到一个缓存 buffer中,通过 buffer刷到数据链路层。因服务端接收数据包时,不能断定数据包1何时结束,就有可能出现数据包2的部分数据结合数据包1发送出去,导致服务器读取数据包1时包含了数 阅读全文
posted @ 2020-11-19 17:31 Java程序员进阶 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 优秀博文:IT-BLOG-CN 序列化 :把对象转换为字节序列存储于磁盘或者进行网络传输的过程称为对象的序列化。反序列化:把磁盘或网络节点上的字节序列恢复到对象的过程称为对象的反序列化。 一、序列化对象 【1】必须实现序列化接口 Serializable:Java.io.Serializable 接 阅读全文
posted @ 2020-11-19 17:21 Java程序员进阶 阅读(6) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往个人博客 Protobuf 全称:Google Protocol Buffers,由谷歌开源而来,经谷歌内部测试使用。它将数据结构以 .proto 文件进行描述,通过代码生成工具可以生成对应数据结构的 POJO 对象和 Protobuf 相关的方法和属性。 一、 Protocol 的特 阅读全文
posted @ 2020-11-19 17:17 Java程序员进阶 阅读(1320) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往个人博客 Thrift 源于 Facebook,在 2007 年 Facebook 将 Thrift 作为一个开源项目提交给了 Apache 基金会。对于当时的 Facebook 来说,创造 Thrift 是为了解决 Facebook 各系统间大数据量的传输通信以及系统之间语言环境不同 阅读全文
posted @ 2020-11-19 17:12 Java程序员进阶 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往个人博客 零拷贝是指避免在用户态(User-space)与内核态(Kernel-space)之间来回拷贝数据的技术。 一、传统 IO 传统 IO(InputStream/OutputStream)读取数据并通过网络发送数据的流程,如下图: ​ 【1】当用户空间使用 read() 询问内 阅读全文
posted @ 2020-11-19 17:09 Java程序员进阶 阅读(30) 评论(0) 推荐(0) 编辑
摘要: 一、BIO、NIO 和 AIO 【1】阻塞 IO(Blocking I/O):同步阻塞I/O模式,当一条线程执行 read() 或者 write() 方法时,这条线程会一直阻塞直到读取一些数据或者写出去的数据已经全部写出,在这期间这条线程不能做任何其他的事情。在活动连接数不是特别高(小于单机1000 阅读全文
posted @ 2020-11-19 17:07 Java程序员进阶 阅读(92) 评论(0) 推荐(0) 编辑
摘要: Dubbo 底层使用 Netty 作为网络通信框架。【网络传输问题】:相对于传统的 RPC 或者 RMI 等方式的远程服务过程调用采用了同步阻塞IO,当客户端的并发压力或者网络时延增长之后,同步阻塞 I/O 会由于频繁的等待导致 I/O 线程经常性阻塞,由于线程无法高效的工作,I/O处理能力自然会下 阅读全文
posted @ 2020-11-19 17:06 Java程序员进阶 阅读(25) 评论(0) 推荐(0) 编辑
摘要: 一、阻塞IO / 非阻塞NIO 阻塞IO:当一条线程执行 read() 或者 write() 方法时,这条线程会一直阻塞直到读取到了一些数据或者要写出去的数据已经全部写出,在这期间这条线程不能做任何其他的事情。 非阻塞NIO:NIO 与原有的 IO 有同样的作用和目的,但是使用的方式完全不同,NIO 阅读全文
posted @ 2020-11-19 16:53 Java程序员进阶 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 当使用 12306 抢票成功后,就会进入付款界面,这个时候就会出现一个订单倒计时,下面我们就对付款倒计时的功能实现,进行深入学习和介绍,界面展示如下:​ 如何实现付款及时呢,首先用户下单后,存储用户的下单时间。下面介绍四种系统自动取消订单的方案: 一、DelayQueue 延时无界阻塞队列 我们的第 阅读全文
posted @ 2020-11-19 16:51 Java程序员进阶 阅读(3743) 评论(0) 推荐(1) 编辑
摘要: 这里说的 js 跨域是指通过 js 在不同的域之间进行数据传输或通信,例如通过 ajax 向一个不同的域请求数据,或者通过 js 获取页面中不同域中(iframe)的数据。只要协议、域名、端口有任何一个不同,都被当作是不同的域 举个简单例子感受一下: ☛ 当我们通过 9105 端口的 js 服务访问 阅读全文
posted @ 2020-11-19 15:14 Java程序员进阶 阅读(101) 评论(0) 推荐(0) 编辑
摘要: 一、Session 介绍 Session 一词直译为 “会话”,意指有始有终的一系列动作/消息。Session 是 Web 应用蓬勃发展的产物之一。在 Web 应用中隐含有“面向连接”和“状态保持”两个含义,同时也指代了 Web 服务器与客户端之间进行状态保持的解决方案。​在 Web 应用诞生之初, 阅读全文
posted @ 2020-11-19 15:10 Java程序员进阶 阅读(284) 评论(0) 推荐(0) 编辑
摘要: 一、什么是FastDFS? FastDFS 是用 C 语言编写的一款开源的分布式文件系统,对文件进行管理,主要功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务。如相册网站、视频网站等等。 FastDFS 为互联网量身定制 阅读全文
posted @ 2020-11-19 15:09 Java程序员进阶 阅读(653) 评论(0) 推荐(0) 编辑
摘要: 一、使用一致性 Hash 算法的原因 简单的路由算法可以使用余数 Hash:用服务器数据除缓存数据 KEY 的 Hash 值,余数为服务器列表下标编码。这种算法可以满足大多数的缓存路由需求。但是,当分布式缓存集群需要扩容的时候,事情就变得棘手了。举个例子:很容易可以计算出,3台缓存服务器扩容至4台服 阅读全文
posted @ 2020-11-19 14:56 Java程序员进阶 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 更多内容,访问 IT-BLOG 外观模式(Facade Pattern):隐藏系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统方法的委托调用。现实 阅读全文
posted @ 2020-11-19 14:55 Java程序员进阶 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 享元模式(Flyweight Pattern):主要用于减少创建对象的数量,以减少内存占用和提高性能。在面向对象程序的设计过程中,有时需要创建大量相似的对象实例。如果都创建将会消耗很多系统资源,它是系统性能提高的一个瓶颈。但如果将这些对象的相似部分抽取出来共享,则能节 阅读全文
posted @ 2020-11-19 14:54 Java程序员进阶 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 在现实生活中,一个对象不能直接访问另一个对象,这时需要找中介来访问目标对象,此时的中介就是代理对象。例如:租房子时,我们无法与房东取得联系,只能通过某网站与中介进行交易,获取自己心仪的房间等等。在软件设计中,使用代理模式的例子也很多,例如:访问阿里的 maven 仓库 阅读全文
posted @ 2020-11-19 14:46 Java程序员进阶 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 现实生活中常常需要给某类产品动态增加新的功能,如:给面条各种调味品。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成一些核心功能。但在不改变其架构的情况下,可以动态地扩展其功能。所以这些都可以采用装饰模式来实现。 一、装饰者定义 【1】装饰者模式:动态的 阅读全文
posted @ 2020-11-19 14:44 Java程序员进阶 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 在生活中,一些对象具有两个或多个维度的变化,如用户购买汽车时,既要考虑品牌(奔驰、哈佛)又要考虑类型(轿车、SUV)等等。如果使用继承的方式实现,m 种品牌和 n 种类型就有 m*n 种,不但对应的子类多,而且扩展困难。如果使用桥接模式就能很好地解决这些问题。 一、传 阅读全文
posted @ 2020-11-19 14:42 Java程序员进阶 阅读(128) 评论(0) 推荐(0) 编辑
摘要: 跟多内容,前往 IT-BLOG 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。它结合了两个独立接口的功能。在现实生活中,经常会遇到类似接口不兼容而不能在一起工作的实例,这是就需要第三者j进行适配,例如:手机与电源,当手机需要充电时,就需要充电器来适配电源。 一、基本介 阅读全文
posted @ 2020-11-19 14:40 Java程序员进阶 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 建造者模式(Builder Pattern):使用简单的对象一步一步构建成一个复杂的对象。这种设计模式属于创建者模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。例如,计算机是由 CPU、 阅读全文
posted @ 2020-11-19 14:38 Java程序员进阶 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 原型模式(Prototype Pattern):是用于创建重复对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。 思想:J 阅读全文
posted @ 2020-11-19 14:35 Java程序员进阶 阅读(9) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 在程序设计中,经常需要访问一个聚合对象中的各个元素,例如:我们使用 list 存储元素,通常的做法是将 list 的创建和遍历放在同一个类中。但这种方法不利于扩展,如果将存储方式更改为数组时,就需要更换迭代方式。违背了 “开闭原则”。“迭代器模式” 能较好的克服以上缺 阅读全文
posted @ 2020-11-19 14:35 Java程序员进阶 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 生活中存在很多 “部分-整体” 的关系,例如:大学中的学校与学院、学院与专业的关系。高楼与楼层和房间之间的关系等等。在软件开发中也有类似的情况。这些简单对象与复合对象之间的关系,如果用组合模式(把学校、院、系都看作是组织结构,他们之间没有继承的关系,而是一种树形结构, 阅读全文
posted @ 2020-11-19 14:32 Java程序员进阶 阅读(125) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 在开发中,有些集合存在多种不同的对象实例(例如:男人、女人),且每个对象也存在多种不同的访问者或处理方式(性格:暴躁、温和)。这样的例子还有很多,例如:好声音节目中不同评委,以及评委对他们的评价的选项,等等。这些被处理的数据元素相对稳定,而访问方式多种多样的数据结构, 阅读全文
posted @ 2020-11-19 14:30 Java程序员进阶 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 软件开发中,通常会存在 “方法的请求者” 与 “方法的实现者” 之间存在紧密的耦合关系。这不利于软件功能的扩展与维护。特别是针对行为进行(撤销、重做、记录)一系列操作时很不方便,因此 “如何将方法的请求者与方法的实现者解耦”,是命令模式的主要任务和功能。在现实生活中, 阅读全文
posted @ 2020-11-19 14:27 Java程序员进阶 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 在面向对象程序设计过程中,程序员常常会遇到如下情况:设计一个系统时知道算法所需的关键步骤,且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如:去医院看病一般都要经历以下流程:挂号、排队、就诊、取药等,其中挂号和排队对每个 阅读全文
posted @ 2020-11-19 14:26 Java程序员进阶 阅读(328) 评论(0) 推荐(0) 编辑
摘要: 跟多内容,前往 IT-BLOG 备忘录模式(Memento Pattern):保存对象的某个状态,以便在未来需要的时候进行数据的恢复。相当容易理解,举个简单的例子:Word 软件在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态; 一、备忘录模式的基本介绍 【1】备忘录模式(M 阅读全文
posted @ 2020-11-19 14:24 Java程序员进阶 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是 “网状结构”,它要求每个对象都必须知道它需要交互的对象。例如,班长和团支书等干部需要记住同学们的电话,且同学中如果有人的电话修改了,需要告诉所有干部,自己的手机号修改了,这叫作 “牵一发而动全 阅读全文
posted @ 2020-11-19 14:23 Java程序员进阶 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 更多内容,前往 IT-BLOG 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。简单工厂模式是由一 阅读全文
posted @ 2020-11-19 14:21 Java程序员进阶 阅读(146) 评论(0) 推荐(0) 编辑