- 博客(47)
- 收藏
- 关注
原创 RocketMQ源码分析之顺序消费
概述RocketMQ按照顺序消费有两种顺序级别,一种是普通顺序消息。另外一种是更完全严格顺序普通顺序消息指的是Producer将消息发送到相对应的消息队列上面完全严格顺序:在普通顺序消息的基础上,Consumer严格进行顺序消费 在绝大部分情况下只需要用到普通顺序消息,大部分的应用都能容忍短暂的乱序;官方文档给出的说明中表示目前只有数据库的Binlog同步会强依赖完全严格顺序(要保证数据库事务
2018-02-13 12:08:46 765
原创 RocketMQ源码分析之Message消费与拉取(下Consume的拉取消费)
各组件大致功能图PushConsumer订阅DefaultPushConsumerImpl#subscrible 首先会创建订阅数据,在里面会根据topic、和订阅表达式将订阅信息放入到SubscriptionInner中,然后通过加分布式锁的方式进行心跳同步Consumer信息到所有的Broker1: public void subscribe(String topic...
2018-02-11 13:16:29 2683
原创 初始化与final关键字
区分重载和重写重载(Overload)指的是在同一个类中对已有的方法名再次编写一个方法,但是要求新写的方法的参数列表或者返回类型要与被重载的方法不一致。值得注意的是,在方法参数列表里面。对基本类型的形参可能会遇到窄化转换,即int类型的实际参数可以会被窄化成byte处理。另外就是对传递进来的实际实参,也会遇到向上自动提升,比如你传递进去的是byte,但是拥有的方法值有接受int的,那么就会自动提升为
2018-02-06 17:37:58 582
原创 【死磕Java并发】——J.U.C之读写锁ReentrantReadWriteLock
概述重入锁ReentrantLock是一中排它锁,它是指同一个线程在获取到锁之后还能再次获取这个锁,背后实际增加的是这个锁的同步状态State. 读写锁ReentrantReadWriteLock则是内部维护了一对锁——读锁和写锁。写锁是排他的,读锁是可共享的。通过分离读锁和写锁,使得并发性比一般的排他锁有了较大的提升:在同一时间可以允许多个读线程同时访问,但是在写线程访问时,所有读线程和写
2018-02-04 16:47:59 306
原创 RocketMQ源码分析之Message拉取与消费(上Broker把消息推送到对应的消费队列)
消费逻辑图: 消费者队列根据Topic、QueueId分别存储相应的消息在CommitLog中的位置信息(offset、size、tagsCode),因此Consume Queue并没有存储实际要消费的信息,而是需要通过实际存储的CommitLog中的位置信息在找一遍真正的要消费的信息消费顺序简图ConsumeQueue存储消息主要有两个服务组件: - Reput
2018-02-04 11:18:20 2467 1
原创 剑指Offer10-15
面试题10:斐波那契数列 题目一:写一个函数,求斐波那契数列第n项 分析:不能用最简单的函数递归F(n)=F(n-1)+F(n-2)来实现,因为这种实现方式由于是递归对内存空间消耗特别大,尤其是n特别大的时候,栈的深度越大,时间就会特别慢。递归分析,迭代实现,避免不必要的空间浪费,每次在迭代中记住前两项的值再相加就可以了 代码实现:public class Solution{
2018-02-04 10:01:34 154
原创 【死磕Java并发】——J.U.C之重入锁:ReentrantLock
锁介绍ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它等同于sychronized,但提供比关键字synchrozied更强大、更灵活的锁机制,性能也能好。API介绍如下: 一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。ReentrantLock 将由最近成功获得锁定,并且还
2018-02-04 09:28:53 406
原创 接口限流(令牌桶算法、漏桶算法)
概述每个借口都有处理请求的极限,也就是我们所说的TPS、QPS,如果对方法或者接口的调用不加限制,那么会有可能导致所有请求阻塞,导致请求接口的直接不能用,甚至让机器宕机。因此需要在方法或者接口调用的时候做限流处理,限制QPS、TPS。 解决思想:控制请求频率,要么直接拒绝,要么让其等待后续处理,或者引流。 两种限流算法:漏桶算法和令牌桶算法漏桶算法每个接口限定一个固定的处理请求
2018-02-02 14:27:12 1213
原创 容器Collection和Map
基本概念Collection:里面包括List、Set、Queue、StackList是有序的,里面的元素可以重复Set集合里面的元素排列无序,元素不可以重复Queue先入先出队列,Stack后入先出堆栈,这两种都可以通过LinkedList来实现,LinkedList继承了Queue接口,直接可以向上转型就可以,而Stack就可以直接用LinkedList提供的本身来做。Ma
2018-02-01 16:42:00 165
原创 RocketMQ源码分析之Message存储
小提示后文中的putMessage并不是将完全将消息存储起来,这里是将消息存储在了Broker内存中,在后面还会有一个消息刷盘的机制,将消息存储到磁盘中,做持久化处理。对象说明我们存储的消息是以CommitLog对象放置,存在映射文件MappedFile中,过程中需要从MappedFileQueue中获得这个最终存储消息的文件。 一个消息存储对象的CommitLog只对应一个Ma
2018-02-01 16:40:28 424
原创 剑指Offer6-8
面试题6:输入一个链表的头结点,从尾到头反过来打印出每个节点的值。 利用堆栈的数据结构,将数据先存进堆里面,然后遍历堆,取出堆里面的元素放进ArrayList里面/**这种结构铁定不是java1.8版本的,因为1.8版本的ListNode结构就直接是List,每个值是一个Node节点,并不能直接得到int val,还是说这种结构是自定义的数字链表结构?* public class
2018-01-31 20:04:02 147
原创 类型信息(RTTI和反射)
前言Java程序在运行时的类型信息可以使得我们在程序运行时发现和使用类型信息。 Java程序有两种方式让我们在运行时识别对象和类的信息: - “传统的”RTTI - 反射机制 RTTI:个人理解,一种思想,让我们的程序在运行时能够识别出具体的对象来,与多态和继承相辅相成,就比如向上转型中,运用的是多态,但是程序在运行时要判断究竟是用哪个具体类型的方法,就靠RTTI来实现,里面又涉及
2018-01-31 16:09:39 188
原创 内部类
小知识内部类拥有对外围内所有成员的全部访问权限,这是因为在外围类创建一个内部类对象时候,内部类对象会自动秘密捕捉一个指向外围类对象的引用,然后通过这个引用去访问这个外围类的所有成员。这种是针对普通的内部类,如果是static静态的嵌套类,是没有指向外部类的引用的,因此是不可以访问非静态外部对象的。 普通内部类是不能出现static数据和字段的,这很好理解,因为普通内部类作为外部类的一部门,普
2018-01-28 11:12:32 138
原创 接口
抽象类和抽象方法它们可以让类的抽象性更加明确起来,告诉我们和编译器将怎样使用它们——表示这个方法或者抽象类是可扩展的,可能会有很多类共有的,特殊的类需要去具体实现里面的抽象方法。当然抽象类里面也可以有除了抽象方法以外还可以有具体的实现方法,而接口里面就只能有声明的抽象方法。 抽象类和抽象方法体现了JAVA重构的思想,让我们用户可以将公共方法沿着继承层次向上移动。接口接口就是将类关
2018-01-26 10:49:29 277
原创 RocketMQ源码解析之消息发送与接受
RocketMQ发送的消息有两种,一种是事务消息,一种是普通消息。 事务消息:在消息发送过程中,需要进行回调,二次确认,这里面用来确认的消息就是事务消息。 普通消息:Producer产生业务消息,让消费者处理的实际业务消息就是普通消息。消息发送与接收整体流程图Producer发送消息局部时序图 Producer发送过程整体说明:首先调用上层的DefaultMQProd
2018-01-25 19:17:43 1319
原创 剑指Offer——1-5
面试题2:设计一个类,我们只能生成该类的一个实例 分析:只能生成类的一个实例,典型的单例设计模式,首先需要考虑多线程环境的并发情况,因此不可以采用最简单的一次性判断null的实现方式,这种实现方式只使用单线程环境;然后就是加锁后双重判断的方式,这种实现方式虽然可以应用于多线程环境,但是因为每次最开的进入需要加锁,每次获取这个单例对象都需要加锁、释放锁的资源开销,性能很差,同样也不适用;第三种就是
2018-01-25 17:14:58 188
原创 前言
这个类别主要是为了提高自己数据结构和算法能力,剑指Offer这本书大家也都知道,掌握这本书确实是面试过程中不可缺少的一环,自己觉得一个程序员要还是要对计算机底层的数据结构和算法好好掌握的。 然后我是学java开发语言的,而剑指Offer这本书是用C语言实现的,不过没关系,正好自己用java实现更够更好的掌握里面的编程思想、算法优化思想,当然有些代码我也只是牛客网里面代码实现的搬运工,希望自己能坚
2018-01-25 10:51:23 167
原创 多态
多态多态可以消除类型之间的耦合,也能够提高程序的可扩展性。向上转型一个类型继承基类,然后在初始化一个新的子类对象的时候,对这个子类的用法它既可以展现出基类的特性也可以展现出其本身类的特性。向上转型就是指在继承树中,基类是处于上层的,然后子类展现出父类或父类以上的类型特征,子类变成基类的类型。 示例代码://乐器基类class Instrument{ public v
2018-01-23 17:38:31 162
原创 消息队列之RabbitMQ原理
什么是AMQP?AMQP,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件而设计的。基于此协议的客户端与消息中间件可以传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。RabbitMQ就是通过Erlang语言实现的一种消息中间件。AMQP的特征AMQP的主要特征是面向消息、队列、路由(包括点对点和发布\订阅模式)、可靠性、安全JMS编程模型connectionFac
2017-10-30 20:04:10 12720
原创 深入理解Java虚拟机(三)-----类文件结构和类加载机制
类文件结构虚拟机在对编译代码的时候会产生字节码的文件,也就是class文件,这个字节码文件的产生是java虚拟机实战跨平台语言操作的重要原因。 首先,这个class文件是一组由8个字节为基础单位的二进制流。它里面依次包括魔数和class文件版本、常量池、访问标志、类索引、父类索引与接口索引集合、字段表集合、方法表集合、属性表集合重点理解常量池和字段表常量池:class文件的资源仓库,它里面存放着很
2017-10-26 18:54:21 178
原创 深入理解Java虚拟机(二)-----垃圾回收(GC)
什么是GCgc指的就是java虚拟机垃圾回收,它回收区域针对的对象是堆内存和方法区,因为栈内存(本地方法栈和虚拟机栈在hotspot虚拟机中统称为栈)它只存活于方法运行时,是由虚拟机自动进行垃圾回收的,不需要程序员关心 Minor GC:对新生代对象的垃圾回收 Full GC(Major GC):对老年代区对象的回收如何判断对象可回收1、引用计数算法(过时):对象被引用,它的引用计数器就会+1,
2017-10-25 17:22:14 224
原创 深入理解Java虚拟机(一)-----Java内存区域和内存溢出
Java虚拟机运行时数据区域java在运行时主要可以分为两类,一类是线程独享的,另外就是线程共享的。程序计数器:记录jvm字节码指令的地址,我自己的理解就是每个线程在执行代码的时候,一条命令在字节码文件中对应一条字节码,然后你要执行下一句指令,就需要知道前一条指令的地址,程序计数器就起到记录这个指令地址的作用。需注意,程序计数器不会抛出内存溢出异常OutOfMemoryError虚拟机栈(本地方法栈
2017-10-25 16:59:06 150
原创 HTTPS学习
HTTPS与SSL组合使用的HTTP就被称为HTTPS HTTPS=HTTP的基础上+加密+认证+完整性保护,http协议组合了SSL(安全套接层)协议或者TLS(安全传输)协议使用,对HTTP的通信内容加密 ps:http协议在通信的时候并不会主动地为通信内容进行加密,而是由开发人员主动为通信内容主体(不包括报文头)采用不同的加密组件人为地加密通信内容,这样间接起到一个安全通信的作用。HTTP
2017-10-24 22:56:03 344
原创 http协议中的状态码
状态码的作用HTTP状态码负责表示客户端HTTP请求返回结果、标记服务器端的处理是否正常、通知出现的错误等工作。状态码的类别1xx 信息性状态码 表示请求正在被处理2xx 成功状态码 表示请求处理完毕3xx 重定向状态码 表示需要进行附加的操作才能完成请求4xx 客户端错误状态码 表示服务器无法处理请求5xx 服务器错误状态码 表示服务器处理请求出错重要
2017-10-21 17:59:59 230
原创 Redis(二)-----缓存优化
穿透优化缓存穿透是指查询一个根本不存在数据,缓存层和存储层都不会命中造成的问题缓存层不命中,每次都要取存储层访问存储层,没有起到保护存储层的作用,更有可能导致后端负载加大引起后端宕机。 检测方式:统计总调用数、缓存命中数、存储层命中数查看是否有大量的存储层空命中如何解决缓存空对象,即使存储层查询不到也返回null给缓存层存储,之后的访问直接从缓存层拿数据了。 设置较短时间的超时清除缓存策略,减
2017-10-16 18:05:46 305
原创 Redis学习(一)-----初识redis
简介Redis是一种非结构化的数据库,将数据采用键值对的形式存储在内存中,由于存储在内存中,所以运行很快。为什么快?所有的数据都是放在内存中进行管理的,当然比存储在外存的结构化数据库快是用C语言实现的,更接近操作系统,运行更快采用单线程架构,避免了多线程产生的资源竞争问题源代码特别精简Redis单线程架构Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库 服务.Redi
2017-10-15 13:15:30 451
原创 排序 算法
简介冒泡排序(快速排序)、简单选择排序(堆排序)、直接插入排序(希尔算法)、归并排序,这几种排序都属于内排序冒泡排序1、思想 最简单冒泡排序:相邻的两个关键字两两相互比较,反序就交换位置,直到没有反序,看起来就像水中的气泡,从数组的最后一个关键字开始比较,较小的气泡慢慢地冒出水面(数组下标靠前),较大的数字留在下面 正宗冒泡排序:从最后两个关键字开始比较,将更小的数字向上作比较,直到找到更小的数
2017-10-14 16:14:54 167
原创 查找
前言主要对各类查找算法的思想分析和复杂度分析顺序表查找算法1、思想 从表中的第一个元素开始查起,逐个与给定值进行对比,直到查找成功或者下标越界失败 2、复杂度分析 由于是逐个查找,因此复杂度为O(n)折半查找1、思想 要求被查找的线性表必须按照顺序存储,然后以一种二分法的思想,进行与给定值比较,等值则查找成功,若所有查找区域无记录,则失败。 代码思路:分别定义最低下标和最高下表,然后取中间
2017-10-13 20:26:23 159
原创 对数据进行哈希加盐加密
介绍哈希加盐是在对密码进行哈希加密的前提下,为了防止查表法对密码的暴力破解,因此需要对密码进行更强的加密,它利用的核心思想是在对真实密码进行加密前,首先生成一个随机的定长字符串,这个字符串就是所谓的“盐”,然后与真实密码连接起来进行哈希加密,这样查表法就不灵了,但我们需要额外的空间来记录这个盐值,为了后来解密需要 在进行密码验证时,需要先从数据库中获得对应的盐值,然后与输入的密码拼接起来进行哈希加
2017-09-28 21:37:45 1160
原创 java并发编程的艺术(六)-----AQS
是什么?AQS是队列同步器(AbstractQueueSynchronizer),是用来构建锁和完成其他同步组件的基本框架,再lock里面,很多的方法都将用到AQS以获取同步状态,实现锁的语义,而不是依靠传统的synchronized中的对象进行锁获取与释放。AQS的核心思想AQS的核心思想是基于volatile int state这样的一个属性同时配合Unsafe工具对其原子性的操作来实现对当前锁
2017-09-27 16:52:47 411
原创 java并发编程的艺术(五)-----线程状态
线程与进程?线程是操作系统调度的最小单元,而进程是系统进行资源分配和调度的一个基本单位。 简单理解:进程是程序的一次执行,线程可以理解为进程中的执行的一段程序片段 360解释:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。线程状态:线程从被
2017-09-25 21:44:52 255
原创 java并发编程的艺术(四)-----线程池
线程池技术产生背景在应用服务器端,需要大量处理来自用户的任务,如果每接收到一个任务服务器端采取采用一个新的线程来处理,然后等到线程结束又关闭,这会造成大量的上下文切换,并且线程的创建和销毁带来的资源占用也很巨大,这就造成了资源浪费。我们通过采用线程池的技术,预先创建若干数量的线程,并且对这些线程的管理不交给用户,因此可以不断地重复利用创建好了的线程去执行任务,从而避免了线程创建和销毁的资源损耗,并减
2017-09-23 20:00:50 226
原创 java并发编程的艺术(三)-----java内存模型
前言要想对java内存模型有深入的了解,就必须得了解里面涉及到的顺序一致性内存模型、重排序以及happen-before顺序一致性模型顺序一致性模型是计算机科学家们提出的一个理想的参考模型,并不是Java运用的模型!再次强调,是一个理想的理论模型!!Java内存模型也需参考顺序一致性模型进行实现,过程中就需要涉及到重排序和happens-before。 顺序一致性内存模型有两大特性来保证为程序猿提
2017-09-23 16:08:42 151
原创 java并发编程的艺术(二)-----volatile、synchronized、final
一、volatile如果一个变量的值被声明成volatile,那么java内存模型会保证所有的线程看到的这个变量的值是一致的,即实现了内存的一致性和可见性.它是synchronized的轻量级如何实现1、Lock前缀指令会让处理器将这个变量的缓存写回到系统内存中 2、每个处理器的缓存写回到系统内存中都会使得其他处理器上面的缓存失效。 ps:处理器上面的缓存就是缓存行,它是CPU高速缓存时的最小存
2017-09-22 20:42:53 183
原创 Java并发编程的艺术(一)-----并发编程的挑战及解决方案
简介在进行Java多线程并发编程开发的时候,我们会遇到上下文切换、死锁以及硬件资源的相关问题,这些问题对程序执行的速度有着重要的影响。 ps:并发编程加快代码执行速度的原则是:将代码中串行化的部分变成并行执行。上下文切换是什么?上下文切换就是程序在多处理器上面(也就是多个CPU)执行的时候,因为受限与于时间片,每个线程都有可能被突然暂停等待下次CPU的继续执行,暂定时肯定需要保存此时线程的执行状态
2017-09-22 19:28:17 201
转载 log4j.properties配置详解与实例
最近使用log4j写log时候发现网上的写的都是千篇一律,写的好的嘛不全,写的全一点的嘛没有一点格式,看着累。这里把网上收集到的整理了一下,并且全部都在机器上测试成功了。这么好的文档估计没有了吧? ##########################################################################①配置根Logger,其语法为: log4j.rootL
2017-09-22 10:54:19 308
原创 分布式文件系统HDFS
HDFS简介HDFS是一种通过网络实现文件在多台主机上进行分布式存储的文件系统,一般采用“C/S”的模式HDFS中的相关概念为了更好地理解和掌握HDFS中的原理和相关技术,我们须得对其里面的一些概念进行了解块 在普通的文件系统中,比如本地文件系统,在我们的磁盘中保存数据,系统并不是以字节进行存储的,而是以数据块进行存储,在普通的文件系统中,数据块的大小一般只有几千字节,而HDFS的数据库块大小默
2017-09-21 20:33:09 2640
原创 spring事务管理
什么是事务?事务就是对数据库的一组逻辑操作,要么全部执行成功,要么全部失败。简言之就是多条sql语句要么都执行成功,要么都不能执行(只有一个失败都不行)。事务管理的目的何在当然是为了保证数据库事务的四大特性(ACID),原子性、一致性、隔离性和持久性。原子性:每一个事务都是不可分割的整体。一致性:在事务执行成功后,能保证数据的完整性,即能保证不出现数据出现偏差的情况发生隔离性:不同事务在对数据
2017-09-20 21:29:46 342
原创 浅谈对Spring mvc的理解和DispatherServlet源码深入分析
简介Spring mvc是Spring 为展示层提供的一个优秀的Web框架,它基于MVC的设计理念,并采用松耦合、可插拔的组件结构,让它比其他的MVC框架更具有灵活性和扩展性。体系结构学习Spring MVC的时候,最重要还是要懂得它里面内部的各个组件是如何运转工作的,我刚开始接触的时候,只想着一门心思去写代码,而忽略了其最精髓的原理理解和逻辑流程,这也导致我在进行Spring mvc配置和编写代码
2017-09-19 20:54:30 1016
原创 任务调度学习-----Quartz和Timer
目的通过编写程序,让计算机在特定的时间点开启线程进行工作实际应用举例在王者荣耀或者英雄联盟中,玩家被惩罚一段时间不能登陆游戏,那么玩家被解除惩罚就通过任务调度完成,在到达的时间点更改玩家的状态,使之可以继续玩游戏。对于一些数据业务,我们有时需要扫描数据库进行统计汇总,比如在在凌晨扫描数据库生成前一天的业务销售情况表以供其他部门分析,这里也需要用到定时任务的调度。Timer讲解java为我们提供
2017-09-18 20:52:37 1327
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人