自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 jvm 生产项目优化

一 查看基本jvm参数 1. 查对应的进程: jps -l 2. 查看设置过值的参数:jinfo -flags pid 3. 查看初始堆内存:jinfo -flag InitialHeapSize pid 4. 查看最大堆内存:jinfo -flag MaxHeapSize pid 5. ...

2020-06-30 19:26:49 25 0

原创 quartz API 学习demo

api调用demo1 package cn.xiniu.quartz; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.impl.StdSchedulerFactory;...

2020-06-07 21:59:50 574 0

原创 缓存热点 key 重建优化

一、问题 当前 key 是一个热点 key( 同一个key,同一个时候有几十万请求),并发量非常 重建缓存不能在短时间完成,可能是一个复杂计算,例如复杂的 SQL、多次 IO、多个依赖等。 二、影响 在缓存失效的瞬间,有大量线程来重建缓存 ( 如下图),造成后端负载加大,甚至可能会让...

2020-05-28 14:38:00 37 0

原创 redis架构设计

一、 简介 高性能(目前已知性能最快) 读速度:110000 次 /s 写速度:81000 次 /s key-value(单个value的最大限制是1GB)类型的内存数据库 数据库在内存中进行操作 定期异步操作将数据库数据flush到硬盘上 支持string,list,set,...

2020-05-26 12:06:15 58 0

原创 Spring的两种动态代理:Jdk和Cglib 的区别和实现

一、原理 jdk动态代理: 利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 cglib动态代理: 利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 如果目标对象实现了接口,默认情况下会采用J...

2020-04-27 08:09:26 153 0

原创 Hashmap底层实现原理(JDK1.8)+红黑树

https://segmentfault.com/a/1190000021928659 https://baijiahao.baidu.com/s?id=1645429373049393021&wfr=spider&for=pc

2020-04-15 14:44:38 269 0

原创 mybaties源码解读

比较好的文章 https://zhuanlan.zhihu.com/p/97879019 https://zhuanlan.zhihu.com/p/31228047 https://zhuanlan.zhihu.com/p/97409923 https://zhuanlan.zhihu.c...

2020-04-13 10:40:40 44 0

原创 controllerAOP管理设计-防重复设计

controllerAOP管理设计-防重复设计 接口结构 代码结构 功能代码 import java.lang.annotation.*; /** * @Author feizhou * @Description 防止同一个方法被频繁执行 * 所有请求的参数都必须...

2019-12-04 17:23:50 64 0

原创 CopyOnWriteArrayList源码

package com.roocon.demo; import java.util.*; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; import java.util.f...

2019-12-02 19:35:11 38 0

原创 spring mvc 拦截器路径匹配原则

一 案例 <mvc:interceptors> <mvc:interceptor> <!-- 对所有的.do结尾的进行拦截,/**表示/下面任何字段,起初我用/*/*.do后来发现/*不能代表所有的字段,要使用/** --> <mvc:...

2019-11-23 14:55:22 13791 0

原创 ConcurrentLinkedQueue源码解析

ConcurrentLinkedQueue 一、 类图 二、 构造方法 public class ConcurrentLinkedQueue<E> .... { // 头节点, private transient volatile Node<...

2019-11-21 23:29:04 56 0

原创 Fork/Join框架

一 可以充分利用CPU资源 将一个任务才分多个任务,最后将结果合并。 二 代码 public class Demo extends RecursiveTask<Integer> { private int begin; private ...

2019-11-12 00:08:16 41 0

原创 关于怎么实现mysql更新,redis同步

定义一个注解A,带有A注解的某个业务B(对应B表), 那么B所有的更新操作都删除reids,并重新新增数据到redis 定义一个AOP,扫描带有A注解的所有方法。方法的所有更新操作都要delete key,add key,value; 方法所有的查询都先查询redis,没有再查数据库 前期开发可以...

2019-11-04 20:04:06 385 2

原创 分布式事务设计

分布式事务设计 一、 什么是分布式事务 一次大的操作由多个小操作组成,这些小操作分布各个独立的服务上,分布式事务需要保证这些小操作要么全部成功,要么全部失败. 保证不同数据库的数据一致性。 保证同一个数据库,在多个独立服务上的数据一致性。 二、分布式事务的产生的原因 2.1、数据库分库分表 ...

2019-11-03 20:36:09 97 0

原创 FutureTask 源码 并发设计模式

一、代码 https://www.jianshu.com/p/60f661d95d53 public static void main(String[] args) throws Exception { Callable<String> call = new Callab...

2019-10-24 00:25:34 118 1

原创 Transaction rolled back because it has been marked as rollback-only

前提:事务嵌套才能存在 原因: A事务,调用B事务,B事务抛出异常(transaction被设置为rollback-only了),然后再A中进行了捕获,但是没有抛出该异常, 那么A事务结束的时候,事务会执commit操作,但是现在事务已经被设置为 rollback-only了,所以会出现这个...

2019-10-22 14:21:53 47 0

原创 mybaties封装

mybaties封装 一、 流程图 二、 好处 方便接口功能扩展 减少开发代码写sql语句的麻烦 代码整洁清晰且易于维护 三、 案例(已一个复杂的查询为案例,代码只给出所需要的代码) 3.1 代码入口 package com.apiserver.producer.sy...

2019-10-16 15:44:20 50 0

原创 Unsafe学习

一 介绍 一个管理内存的类 Unsafe类是"final"的,不允许继承。且构造函数是private的 使用单列模式模式获取类对象 1.1 测试的类 public class UnsafeBean { private static int staticInt = 5...

2019-10-10 09:42:15 43 0

原创 签名设计+数据加密设计

一 签名设计 1.1签名生成的步骤如下: 参数名ASCII码从小到大排序(字典序) 案例 buid=12&accoutid=0 —> accoutid=0&buid=12 请求参数使用URL键值对的格式(key1=value1...

2019-09-29 16:45:17 184 0

原创 controllerAOP管理设计

controllerAOP管理设计 结构 为什么要设计这个接口 对controller的方法AOP处理,不同的开发人员因为对业务的理解不同,做很多处理,定义了很多切点,最后形成维护了很多功能的AOP管理。案例如下 开发1:实现一个注解a,调用a注解的方法有起到防重复的功能。开发1定义一个A...

2019-09-29 14:41:22 68 0

原创 @CallerSensitive

CallerSensitive学习 代码位置(Reflection类) public class Reflection { @CallerSensitive public static native Class<?> getCallerClass(); 权限 R...

2019-09-28 13:49:11 195 0

原创 分布式系统中主键生成策略

主键生成策略 1分布式系统中主键生成的问题 案例,在集群的写库中,生成的主键重复的问题。比如说,A库用户表插入一条数据,生成主键id=1,B库用户表插入的数据,生成的主键id也为1,那么应该怎么办让A,B库生成的主键id不重复,且有序呢。 策略 1Snowflake(雪花算法,现在非常流行) ...

2019-09-19 19:53:57 550 0

原创 针对高并发的思路

思路 一数据库读写分离 在实际的项目中,我们对读的操作是大于写操作的,如果读写都在一个库的情况下,写操作会锁行数据,这个时候查询数据库就会很慢,非常影响性能,而且数据库读写切换也是非常耗性能的。 读写分离后,对数据库的读操作去读库,写操作去写库,会提高高并发的数据库访问性能,但是也有风险...

2019-09-11 11:17:06 46 0

原创 Kafka_概念

一Kafka 是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统 可以当做MQ系统 用于web/nginx日志、访问日志,消息服务等等 主要应用场景:日志收集系统和消息系统。 作为一个集群运行在一个或多个服务器上 kafka集群存储的消息是以to...

2019-09-11 00:02:00 34 0

原创 Guava Cache

Guava Cache 与ConcurrentMap很相似 ConcurrentMap会一直保存所有添加的元素,直到显式地移除。而Guava Cache为了限制内存占用,通常都设定为自动回收元素。 在某些场景下,尽管LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存...

2019-09-10 23:43:41 29 0

原创 高并发 - 服务降级与服务熔断

为什么要服务降级 假设一个服务器1秒最大只能并发处理5W条请求,如果用户并发请求6万,那么多的1万请求在1秒内多出1W个cpu时间切片,这些cpu时间切片占用了1秒的资源,导致前面5W请求不够资源,这个时候大家都要花费时间在等待资源的时间上,如果这个时候后续请求都是超过5W,那么前面的请求来不及...

2019-09-09 23:32:03 455 0

原创 高并发设计_限流

高并发设计 一思路 缓存、降级和限流。 1. 缓存 提升系统访问速度和增大系统能处理的容量。 2. 降级 当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开 3. 限流 用来处理前面2种不能解决的情况,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)...

2019-09-07 15:26:52 46 0

原创 BlockingQueue

一BlockingQueue 阻塞队列 向队列中添加元素时,队列的长度已满阻塞当前添加线程,直到队列未满或者等待超时; 从队列中获取元素时,队列中元素为空 ,会将获取元素的线程阻塞,直到队列中存在元素 或者等待超时。 二方法 puts操作 add(E e) : 添加成功返回true...

2019-08-31 18:18:45 1063 0

原创 CountDownLatch

一CountDownLatch CountDownLatch是JDK 5+里面闭锁的一个实现。 能够使一个或多个线程等待其他线程完成各自的工作后再执行 与CountDownLatch第一次交互是主线程等待其它的线程,主线程必须在启动其它线程后立即调用await方法,这样主线程的操作就会在这...

2019-08-31 17:18:33 30 0

原创 CyclicBarrier调试

 一CyclicBarrier 控制所有线程等待,知道达到某种条件,所有的线程才会继续走下去 是一个同步工具类 它允许一组线程互相等待,直到到达某个公共屏障点才停止等待 与CountDownLatch不同的是该barrier(屏障)在释放等待线程后可以重用,所以称它为循环(Cyclic)...

2019-08-31 17:00:39 33 0

原创 Exchanger类调试

一Exchanger java.util.concurrent包中 只可以用于两个线程之间交换信息。 二案例 public class ExchangerTest { public static void main(String[] args) { ExecutorServ...

2019-08-31 16:31:06 30 0

原创 Semaphore调试

一Semaphore 通过许可证管理多个线程的执行,有许可证的线程可以执行,没有许可证的线程会等待。 二Semaphore方法说明 Semaphore(permits):初始化许可证数量的构造函数 Semaphore(permits,fair):初始化许可证数量和是否公平模式的构造...

2019-08-31 12:02:30 73 0

原创 Lock锁和Condition条件

Lock的特性: Lock不是Java语言内置的; synchronized是在JVM层面上实现的,如果代码执行出现异常,JVM会自动释放锁,但是Lock不行,要保证锁一定会被释放,就必须将unLock放到finally{}中(手动释放); 在资源竞争不是很激烈的情况下,Synchroni...

2019-08-30 00:49:18 309 0

原创 购物流程接口设计+案例

购物流程接口设计 为什么要设计这个接口 要实现代码校验和逻辑抽离 数据出错修复,打个比方说,用户支付订单后,但是订单数据还是未支付。 异步执行修复数据或者任务,不影响业务功能,加速请求校验。 打个比方说:服务商取消订单,需要发送消息给对应的用户终端,这个时候可以将发送功能接触数据...

2019-08-28 11:37:20 150 0

原创 java 内存模型与线程

java 内存模型与线程 一 Java 内存模型 1 主内存和工作内存之间的交互 2对于 volatile 型变量的特殊规则 关键字 volatile 是 Java 虚拟机提供的最轻量级的同步机制。 一个变量被定义为 volatile 的特性: 保证此变...

2019-08-07 00:19:29 61 0

原创 JDK7和JDK8的JVM内存模型的总结

一、方法区变化 1.8同1.7比,最大的差别就是: 元数据区取代了永久代,就是JDK8没有了PermSize相关的参数配置了。 元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。 1)方法区与永久...

2019-08-01 00:39:37 819 0

原创 JVM启动流程

一 JVM启动流程图 二 Java程序执行的流程图 三jvm.cfg 、jvm.dll的位置

2019-08-01 00:12:28 68 0

原创 java程序的运行过程

一java程序在的执行过程 程序运行前 当程序准备执行时,由 JVM 向操作系统请求一定的内存空间,称为初始内存空间。程序执行过程中所需的内存都由 Java 虚拟机从这片内存空间中划分。这样做的一个重要优点是保证了程序的平台无关性。 程序运行中 Java 程序一直向 Java 虚拟机申...

2019-08-01 00:03:11 92 0

原创 LAST_INSERT_ID使用造成订单串单问题

订单串单问题 代码 String sql ="insert into ....."; this.update(sql); List<Long> list = this.queryBySql(Long.class, "select LAST_INSERT_I...

2019-07-30 20:09:16 101 0

原创 JAVA方法调用中的解析与分派

JAVA方法调用中的解析与分派 方法调用 方法调用并不等于方法的执行 方法调用阶段唯一的任务就是确定被调用方法的版本(考虑多态情况)。 解析 所有的方法调用中的目标方法在Class文件中都是一个常量池中的符号引用,在类加载的解析阶段,会将其中的一部分引用转化为直接引用,这种解析的前提...

2019-07-25 07:42:06 159 0

提示
确定要删除当前文章?
取消 删除