- 博客(167)
- 资源 (28)
- 收藏
- 关注
原创 BlockingQueue及其实现
1. 前言BlockingQueue即阻塞队列,它是基于ReentrantLock,依据它的基本原理,我们可以实现Web中的长连接聊天功能,当然其最常用的还是用于实现生产者与消费者模式,大致如下图所示:在Java中,BlockingQueue是一个接口,它的实现类有ArrayBlockingQueue、DelayQueue、 LinkedBlockingDeque、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue等...
2021-02-28 18:02:24
625
原创 RocketMQ原理刨析
RocketMQ原理本文类容基本上和RocketMQ design类似,并无过多的改动。主要内容包括:RocketMQ概述,主要是概念上的一些内容RocketMQ的特点以及消息发送、消费模型RocketMQ原理:mmap+write,文件系统,数据存储结构,队列,刷盘策略,消息查询,消息过滤,事务消息,发送、订阅负载均衡,同步双写/异步复制,充分利用内存,消息堆积能力以及解决办法一、RocketMQ概述1. MessageFilter1) Broker端消息过滤...
2021-02-27 20:31:00
648
原创 mysql分组后获取每个组排序后的第一条数据(整行)
有一个学生分数表student,数据结构是这样的id(当前表ID)student_id(学生ID)line(分数)subject_type(科目类型)118012...
2020-03-04 11:07:31
7801
1
原创 Java8开始ConcurrentHashMap,为什么舍弃分段锁
概述我们知道, 在 Java 5 之后,JDK 引入了 java.util.concurrent 并发包 ,其中最常用的就是ConcurrentHashMap 了, 它的原理是引用了内部的 Segment (ReentrantLock ) 分段锁,保证在操作不同段 map 的时候, 可以并发执行, 操作同段 map 的时候,进行锁的竞争和等待。从而达到线程安全, 且效率大于 synchr...
2019-12-27 14:08:49
15600
3
转载 内存屏障
内存屏障(Memory barrier)为什么会有内存屏障每个CPU都会有自己的缓存(有的甚至L1,L2,L3),缓存的目的就是为了提高性能,避免每次都要向内存取。但是这样的弊端也很明显:不能实时的和内存发生信息交换,分在不同CPU执行的不同线程对同一个变量的缓存值不同。 用volatile关键字修饰变量可以解决上述问题,那么volatile是如何做到这一点的呢?那就是内存屏障,内存屏障...
2019-12-27 12:05:14
243
原创 深入理解Java HashMap
1. 概述从本文你可以学习到:什么时候会使用HashMap?他有什么特点? 你知道HashMap的工作原理吗? 你知道get和put的原理吗?equals()和hashCode()的都有什么作用? 你知道hash的实现吗?为什么要这样实现? 如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办?当我们执行下面的操作时: ...
2019-12-27 11:51:52
198
原创 Redis的数据淘汰策略有哪些
Redis 提供 6 种数据淘汰策略(即,内存淘汰策略)volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用 的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数 据淘汰 volatile-random:从已设置过期时间的数据集(server.db[i].ex...
2019-12-24 18:19:36
182
原创 线程的生命周期状态图,及相应概念。
一、线程的生命周期线程状态转换图:1、新建状态(New)用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)。注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadStateException异常。2...
2019-12-24 16:51:06
659
原创 记录:一道java类加载时机与过程的面试题
以前曾经看到过一个java的面试题,当时觉得此题很简单,可是自己把代码运行起来,可是结果并不是自己想象的那样。题目如下:class SingleTon { private static SingleTon singleTon = new SingleTon(); public static int count1; public static int count2 = ...
2019-12-24 15:45:17
147
原创 怎么打破双亲委派机制, 双亲委派模型的好处。
双亲委派模型的好处:在于Java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存在在rt.jar中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的Bootstrap ClassLoader进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。相反,如果没有双亲委派模型而是由各个类加载器自行加载的话,如果用户编写...
2019-12-24 15:27:33
554
原创 CMS垃圾收集器与G1收集器
1、CMS收集器CMS收集器是一种以获取最短回收停顿时间为目标的收集器。基于“标记-清除”算法实现,它的运作过程如下:1)初始标记2)并发标记3)重新标记4)并发清除初始标记、从新标记这两个步骤仍然需要“stoptheworld”,初始标记仅仅只是标记一下GCRoots能直接关联到的对象,熟读很快,并发标记阶段就是进行GCRootsTracing,而重新标...
2019-12-24 15:07:27
143
原创 100亿个整数如何找到中位数?内存足够和内存不足两个场景
100亿个整数,内存足够,如何找到中位数?内存不足,如何找到中位数?(1)当内存足够时:采用快排,找到第n大的数。• 随机选取一个数,将比它小的元素放在它左边,比它大的元素放在右边• 如果它恰好在中位数的位置,那么它就是中位数,直接返回• 如果小于它的数超过一半,那么中位数一定在左半边,递归到左边处理(还是第几大)• 否则中位数一定在右半边,根据左半边的元素个数计算出中位数是右半...
2019-12-24 15:05:05
2140
转载 Java虚拟机垃圾回收(四) 总结:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法
Java虚拟机垃圾回收(四) 总结:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法在《Java对象在Java虚拟机中的创建过程》了解到对象创建的内存分配,在《Java内存区域 JVM运行时数据区》中了解到各数据区有些什么特点、以及相关参数的调整,在《Java虚拟机垃圾回收(一) 基础》中了解到如何判断对象是存活还是已经死亡?在《Java虚拟机垃圾回收(二)...
2019-12-24 15:01:12
142
转载 Java虚拟机垃圾回收(三) 7种垃圾收集器:主要特点 应用场景 设置参数 基本运行原理
Java虚拟机垃圾回收(三) 7种垃圾收集器主要特点 应用场景 设置参数 基本运行原理在《Java虚拟机垃圾回收(一) 基础》中了解到如何判断对象是存活还是已经死亡?在《Java虚拟机垃圾回收(二) 垃圾回收算法》了解到Java虚拟机垃圾回收的几种常见算法。下面先来了解HotSpot虚拟机中的7种垃圾收集器:Serial、ParNew、Paralle...
2019-12-24 14:58:50
124
转载 Java虚拟机垃圾回收(一) 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析
在《Java内存区域 JVM运行时数据区》中了解到各数据区有些什么特点、以及相关参数的调整,知道了:程序计数器、虚拟机栈、本地方法栈这3个区域是随线程而生而灭的,内存分配和回收都具备确定性,而Java堆和方法区则不一样,各线程共享,在运行时内存的分配与回收都是动态的,垃圾收集器所关注的是这部分内存。接下来几篇文章我们来详细了解Java堆和方法区的内存分配与回收,下面先...
2019-12-24 14:55:58
186
转载 Java虚拟机垃圾回收(二) 垃圾回收算法 标记-清除算法 复制算法 标记-整理算法 分代收集算法 火车算法
在《Java虚拟机垃圾回收(一) 基础》中了解到如何判断对象是存活还是已经死亡? 介绍了垃圾回收基础算法:引用计数算法、可达性分析算法,以及HotSpot虚拟机中实现对象可达性分析的一些问题。下面先来了解Java虚拟机垃圾回收的几种常见算法:标记-清除算法、复制算法、标记-整理算法、分代收集算法、火车算法,介绍它们的算法思路,有什么优点和缺点,以及主要应用场景。...
2019-12-24 14:54:21
225
原创 关于【缓存穿透、缓存击穿、缓存雪崩、热点数据失效】问题的解决方案
1 前言在我们的平常的项目中多多少少都会使用到缓存,因为一些数据我们没有必要每次查询的时候都去查询到数据库。特别是高 QPS 的系统,每次都去查询数据库,对于你的数据库来说将是灾难。今天我们不牵涉多级缓存的知识,就把系统使用到的缓存方案,不管是一级还是多级的都统称为缓存,主要是为了讲述使用缓存的时候可能会遇到的一些问题以及一些解决办法。我们使用缓存时,我们的业务系统大概的调用流程如...
2019-12-23 15:33:27
162
原创 二维矩阵顺时针旋转90度
今天仍然来分析一个与数组操作相关的算法,是关于二维数组旋转问题的。问题描述原文You are given an n × n 2D matrix representing an image.Rotate the image by 90 degrees (clockwise).Follow up: Could you do this in-place?大意:给一个 n * ...
2019-12-22 14:22:56
5624
原创 java中的4种引用:强引用、软引用、弱引用和虚引用
我们知道java语言提供了4种引用类型:强引用、软引用(SoftReference)、弱引用(WeakReference)和幽灵引用(PhantomReference),与引用密切相关的,还有一个引用队列ReferenceQueue。引用和引用队列的关系,对于垃圾回收来说非常重要,学习垃圾回收机制,必须要先了解引用和引用队列的使用方法。本文主要参考网上的一些理论,同时配合自己的一些测试代码,更好的...
2019-12-22 13:17:22
204
原创 四种元注解:@Retention @Target @Document @Inherited
java中元注解有四个:@Retention @Target @Document @Inherited; @Retention:注解的保留位置 @Retention(RetentionPolicy.SOURCE)//注解仅存在于源码中,在class字节码文件中不包含 @Retention(RetentionPolicy.CLASS)...
2019-12-03 10:42:55
228
原创 @SneakyThrows
@SneakyThrows大胆抛出已检查的异常,以前没有人抛出它们!Overview@SneakyThrows可以用来偷偷抛出已检查的异常而不在方法的throws子句中实际声明这一点。当然,应该谨慎使用这种有争议的能力。由lombok生成的代码不会忽略,包装,替换或以其他方式修改抛出的已检查异常; 它只是伪造了编译器。在JVM(类文件)级别,无论方法的throws子句如何,都可以抛出所...
2019-12-03 10:38:11
37554
8
转载 Spring 中@transactional
事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Tr...
2019-09-06 11:02:02
273
原创 JPA事务处理(坑)
1、JPA事务JPA的确没有提供事务级别的设置,只提供了@TransactionAttribute注释用作定义一个需要事务的方法。它可以有以下参数:1.REQUIRED:方法在一个事务中执行,如果调用的方法已经在一个事务中,则使用该事务,否则将创建一个新的事务。2.MANDATORY:方法必须在一个事务中执行,也就是说调用的方法必须已经有一个事务,否则新抛出一个错误(ERROR)...
2019-09-06 10:40:16
1763
原创 hibernate/jpa事务提交执行sql顺序(坑)
SSH框架下,spring的事务中提交时hibernate的sql执行顺序错乱,未按代码顺序实现。 JPA也是。Hibernate在最终执行SQL语句时,居然是按INSERT, UPDATE, DELETE的顺序执行的,而非按照代码顺序执行!原因hibernate了性能优化,不会把sql语句直接提交给数据库,而是先放在hibernate的缓存中等事务commit的时候一起提交,为的是...
2019-09-06 10:39:06
4182
原创 高并发锁事务重试机制(JPA高并发下的乐观锁异常)
乐观锁:model实体类加version字段 @JsonProperty("_version") @Column(name = "version", nullable = false) @Version private Long version = 0L;问题场景先在库里查询出该实体,转化为持久态,在这时库里的该数据被修改了...
2019-09-04 15:28:45
2371
原创 JPA生命周期相关注解
在我们使用JPA对数据库进行操作的时候,我们时常会出现数据库字段设置未不能为空,而我们保存的字段为null导致程序报错。这个时候我们就可以使用 @PrePersist @PostPersist 注解回调方法来解决问题。回调方法是附加到实体生命周期事件的用户定义方法,并且在发生这些事件时由JPA自动调用。我们可以发现有很多类似的注解可以使用:@PrePersist- 在新实体持久化之前(...
2019-09-04 14:21:19
365
原创 千万级流量,架构设计方案初窥。
随着互联网的发展,各项软件的客户量日益增多,当客户量达到一定峰值时,当数以万计的流量来临时,程序的顺利运行以及即时响应则显得尤为重要,就像双11那天的淘宝一样。那么,如何设计架构才能够抗住这千万级的流量。老板让你抗住千万级流量,如何做架构设计?首先,要在我们架构设计的时候建立一些原则。1. 实现高并发服务拆分:将整个项目拆分成多个子项目或者模块,分而治之,将项目进行水平扩展。...
2019-09-03 10:36:48
572
原创 Java线程池ThreadPoolExecutor详解
Java线程池ThreadPoolExecutor详解1、线程池的工作原理?线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。 当调用 execute() 方法添加一个任务时,线程池会做如下判断: 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务; 如果正在运行的线程数量大于...
2019-09-02 19:51:32
202
原创 如何保证缓存与数据库的双写一致性?
分布式缓存是现在很多分布式应用中必不可少的组件,但是用到了分布式缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题?Cache Aside Pattern最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern。读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,...
2019-08-30 15:04:22
166
转载 Hbase深入浅出
目录HBase 在大数据生态圈中的位置HBase 与传统关系数据库的区别HBase 相关的模块以及 HBase 表格的特性HBase 的使用建议Phoenix 的使用总结HBase 在大数据生态圈中的位置提到大数据的存储,大多数人首先联想到的是 Hadoop 和 Hadoop 中的 HDFS 模块。大家熟知的 Spark、以及 Hadoop 的 MapRedu...
2019-08-21 16:58:19
177
原创 通过注解扫描加载指定路径下的所有注解定义的规则类
通过注解,扫描加载指定路径下的所有注解定义的规则类,实现方法。思想:扫描注册,映射匹配。优势:解耦,代码易读,组件化等等应用场景和具体实现大家可自行摸索。以下为示例代码,提供思路,可自行修改。方法一:扫描class文件,通过反射实例化对象,适合有状态对象。import java.util.ArrayList;import java.util.List;imp...
2019-08-21 16:32:33
1569
原创 Spring Boot中使用Swagger2构建强大的RESTful API文档
Spring Boot中使用Swagger2构建强大的RESTful API文档由于Spring Boot能够快速开发、便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful API。而我们构建RESTful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端。这样一来,我们的RE...
2019-08-20 14:45:26
88
原创 java并发编程:多线程通信
线程间的通信这里我们有一个需求,如下: 分别开一个线程代表两个工作者,一个负责挖坑,一个负责埋土,要求挖一个埋一个,实现挖坑、埋土、挖坑、埋土.....循环下去 先看一下下边得实现public class Test { String s = ""; public synchronized void dig() { s = "挖坑"; } public sync...
2019-06-28 18:15:54
187
原创 数据结构及算法:链表相关(如何判断单链表是否存在环、找出入环点、链表相交等问题)
目录一、如何判断单链表是否存在环方法一、穷举遍历方法二、哈希表缓存方法三、快慢指针(推荐)方法四、Set集合大小变化二、如何找出有环链表的入环点?方法一、用HashSet来解决方法二、计算循环(快慢指针)情况一:多走一个环情况二、当fast比slow 多走n个环代码实现三、如果存在环,求出环上节点的个数;四、如果存在环,求出链表的长度;...
2019-06-27 17:03:38
1175
原创 java容器:HashMap
HashMap 概述Map 是 Key-Value 对映射的抽象接口,该映射不包括重复的键,即一个键对应一个值。HashMap 是 Java Collection Framework 的重要成员,也是Map族(如下图所示)中我们最为常用的一种。简单地说,HashMap 是基于哈希表的 Map 接口的实现,以 Key-Value 的形式存在,即存储的对象是 Entry (同时包含了 Key 和 ...
2019-06-21 17:51:03
484
原创 软件开发模式:各软件开发模式对比(瀑布、迭代、螺旋、敏捷)
1、瀑布模型是由W.W.Royce在1970年最初提出的软件开发模型, 瀑布式开发是一种老旧的计算机软件开发方法。瀑布模型式是最典型的预见性的方法,严格遵循预先计划的需求分析、设计、编码、集成、测试、维护的步骤顺序进行。步骤成果作为衡量进度的方法,例如需求规格,设计文档,测试计划和代码审阅等等。瀑布式的主要的问题是它的严格分级导致的自由度降低,项目早期即作出承诺导致对后期需求的变化难...
2019-06-21 15:37:00
620
原创 JAVA消息系列:JMS详解
目录JAVA消息系列—JMS前言基本概念消息模型P2P模式Pub/Sub模式消息的消费JMS编程模型JAVA消息系列—JMS前言java 消息模块个人理解分为两种: 同步消息(RPC调用) 异步消息(本篇讲解部分) 同步消息java提供了多种方案: 新比较常用的方式就是s...
2019-06-18 16:36:44
9723
转载 基础框架:mybatis工作原理
引言在mybatis的基础知识中我们已经可以对mybatis的工作方式窥斑见豹(参考:《MyBatis————基础知识》)。但是,为什么还要要学习mybatis的工作原理?因为,随着mybatis框架的不断发展,如今已经越来越趋于自动化,从代码生成,到基本使用,我们甚至不需要动手写一句SQL就可以完成一个简单应用的全部CRUD操作。从原生mybatis到mybatis-spring,到myb...
2019-06-10 14:49:09
1993
原创 设计模式:抽象工厂模式
目录概述解决问题代码实现visio图概述 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。可以理解成是多个工厂方法的组合。解决问题 在工厂方法模式中,我们的具体创建者每次使用都只能创建一个同类型的对象,假如我们现在需要的是多个不同类型的对象,工厂方法就满足不了需求了。这时我们可以把多个工厂方法组合到一个类,这就是抽象工厂模式...
2019-05-30 17:47:33
150
selenium-server-standalone-3.6.0.jar
2017-11-21
JDK下载安装文档
2017-11-17
解决:dubbo找不到dubbo.xsd报错
2017-10-23
pdf.JS下载
2017-09-18
iText解决中文支持及中文换行修改后的jar
2017-09-18
javassist-3.18.0-ga.jar
2017-08-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人