- 博客(40)
- 资源 (1)
- 收藏
- 关注
原创 Java并发的实现和应用
线程安全的概念,怎么保证线程安全线程的同步异步,阻塞非阻塞线程的并发和并行Java内存模型(原子性,可见性,有序性)线程状态及流转线程死锁和避免synchronized和volatile关键字?线程的3种实现方式线程的交互方式,中断通知等待等线程池用的队列原理分析线程池的种类里用法(单实例,固定线程池等基础实现,ForkjoinPool)线程安全的单实例实现方式线程池的同步...
2019-08-28 09:27:27
384
原创 常用的设计模式Java实现及解析
以下说明(部分)解释摘录/参考自《Head First设计模式》design-patternsobserver pattern 观察者模式my implementation观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。my implementation of many observers to many subjectsjd...
2019-05-02 11:57:30
723
原创 CacheLoader returned null for key分析和解决
背景今天在使用的时候使用GuavaCache的refreshAfterWrite的功能时,发现在少数场景下会报错CacheLoader returned null for key。但是如果把refreshAfterWrite去掉时,又不会报错。具体错误内容是这样的。com.google.common.cache.CacheLoader$InvalidCacheLoadException: Ca...
2019-04-26 21:44:46
25028
3
原创 设计模式-观察者模式
前言关于观察者模式比较简单,网上解释的很多很多,解释的都挺好理解的,因此这里并不打算说明太多,有关实现和案例源码已上传至https://github.com/zhuzhenke/design-patterns,提供了两种实现方案,一种是jdk实现,一种是我自己实现了可多观察者观察多主题。本文重点本文的关注点在于领域模式的封装,重点在于jdk的实现,和自己实现的区别,各自优势分析。下面是我在分...
2019-04-19 09:03:18
1344
原创 比AtomicLong更高效的并发计数类LongAdder
比AtomicLong更高效的并发计数类LongAdder(本文为原创文章,未经博主同意,禁止任何形式转载!)最近在看https://github.com/alibaba/Sentinel(轻量级的流量控制、熔断降级 Java 库)源码的时候,看到在统计数量的时候使用了LongAdder。这个LongAdder是jdk1.8新增的,出自Doug Lea之手,伟大的Java并发大师的鼻祖。在没有...
2019-04-05 20:34:25
3680
原创 ForkJoin框架使用和原理剖析
ForkJoin使用和原理剖析相信大家此前或多或少有了解到ForkJoin,ForkJoin框架其实就是一个线程池ExecutorService的实现,通过工作窃取(work-stealing)算法,获取其他线程中未完成的任务来执行。可以充分利用机器的多处理器优势,利用空闲的线程去并行快速完成一个可拆分为小任务的大任务,类似于分治算法。ForkJoin的目标,就是使用所有可用的处理能力来提高程序...
2019-03-21 23:49:59
12836
3
原创 Java8新特性学习(二)- Optional类
背景Optional是一个容器,用来管理一个对象。主要是用来解决null和NullPointerException问题。Java7 -> Java8 Optional是如何简化你的代码假设有一个Student类@Datapublic class Student { private String name; private Integer age; publ...
2019-02-20 22:03:33
3536
原创 Java8新特性学习(一)- 开篇介绍
背景随着工作的深入,用到的知识是越来越多,代码中用到Java8的特性也越来越多,如果只是知道几个简单的用法而不从本质上去知道其背景、实现原理,理解代码是一件相对困难的事情。基于此,接下来将相对系统的去学习Java8的一些新特性,也算是用自燃的方式来点燃各位想要掌握新知识的同学,一起进步!新特性Oracle在2014年就发布了Java8,Java8是Java语言的一个重要的版本。Java8支持...
2019-02-18 23:38:09
3091
原创 Guava Cache expireAfterWrite 与 refreshAfterWrite区别
前面的文章缓存篇(一)- Guava有讲到Guava Cache有区别于ConcurrentHashMap的使用,就是因为其自带有自动刷新和自动失效的功能,避免我们去自己编写刷新和失效的后台线程程序。Guava Cache提供了简单便捷的api给我们使用,但是研究源码发现这里的自动刷新缓存和自动失效原理,并非是Guava Cache帮我们去添加了类似后台线程自动刷新或失效逻辑的代码,而是用另外一种...
2019-02-17 12:42:43
25318
原创 别踩坑!使用MySQL唯一索引请注意
背景在程序设计中了,我们往往需要确保数据的唯一性,比如在常见的注册模块,我们需要确保一个手机号只能注册为一个账号。这种情况下,我们的程序往往是第一道关卡,用户来注册之前,首先判断这个手机号是否已经注册,如果已经注册则返回错误信息。但是我们不能确保同时有两个人使用同一个手机号注册到我们的系统中,因此这里就需要在更深的层次去确保手机号的唯一性了。不同存储方案,解决方式不一样,这里以MySQL为例,我...
2019-01-28 21:33:14
29873
8
原创 HashMap的算法解析及高并发下死循环分析
HashMap是一个以空间换时间,内部以数组+链表\红黑树实现的散列表。HashMap的具体原理我们不做深入仔细分析,这类文章网上较多,且HashMap在面试中命中率极高。本文以jdk1.8为例,只分析里面我认为值得拿出来分析的有关数据结构和算法的部分来讲解。HashMap的长度HashMap的初始默认长度是16.HashMap在jdk1.8上做了一层优化,创建时并没有创建Node数组,只有首...
2018-12-06 08:59:34
3056
原创 排序算法总结(含动图演示和Java代码实现)
本文将围绕冒泡排序、桶排序、计数排序、堆排序、插入排序、并归排序、快速排序和选择排序,按照描述、时间复杂度(最坏情况)、动态图展示和代码实现来讲解。本文默认排序为从小到大。本文相关代码已上传至github,欢迎关注https://github.com/zhuzhenke/common-algorithms公用方法SortUtilspublic class SortUtils { ...
2018-12-03 08:10:15
4342
2
原创 MySQL基本原理和使用技巧
本文是我在大半年前在前公司做团队分享时的一个文档,写得比较挫,当时分享讲了2个小时,自己感觉讲得还可以。最近前同事跑来问我还有没有文档保存,翻了旧电脑和硬盘才找出来,于是就想着分享一下。一、MySQL整体结构服务器层(负责客户端连接、授权认证、安全、线程管理等)核心层(缓存查询、解析器、查询优化器、函数)(存储过程,触发器,视图)存储引擎层(MyISAM、InnoDB、Mem...
2018-11-13 23:51:37
3575
原创 缓存篇(三)- Spring Cache框架
前两篇我们讲了Guava和JetCache,他们都是缓存的具体实现,今天给大家分析一下Spring框架本身对这些缓存具体实现的支持和融合,使用Spring Cache将大大的减少我们的Spring项目中缓存使用的复杂度,提高代码可读性。本文将从以下几个方面来认识Spring Cache框架背景SpringCache产生的背景其实与Spring产生的背景有点类似。由于Java EE 系统框架...
2018-10-15 08:11:03
10757
原创 缓存篇(二)- JetCache
本文将由浅入深,从基本特性介绍,从简单demo使用,到JetCache源码分析,到Spring Aop的源码分析,到如何利用这些知识去自己尝试写一个自己的cache小demo,去做一个全面的概括。*背景和特性*用法demo*JetCache源码分析*Spring Aop的支持和源码分析*写一个简单的cache框架demo 背景和特性对于一些cache框架或产品,我们...
2018-09-28 19:27:25
15298
2
原创 缓存篇(一)- Guava
接下来几篇给大家分享一下缓存相关的内容,包括但不限于Guava,JetCache和Spring Cache等。 Guava产生的背景 最常见最简单的方式就是我们使用HashMap或者ConcurrentHashMap,在内存中缓存数据,通过key存放value,通过key读取我们需要的value数据。但是这里存在一个问题,value是会过期的。所以我们还得需要设置一个定...
2018-08-04 17:41:52
3370
原创 RPC框架(二) - Dubbo
Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。dubbo目前已经有apache托管,官方文档查看请点击http://dubbo.apache.org/books/dubbo-user-book/ 下面针对dubbo服务框架,针对几个重要的点作针对性的介绍。 1、注册中心的作用,...
2018-06-11 11:41:14
1303
原创 RPC框架(一) - Java自带的RMI
接下来的文章中,我将会去分析Java语言中常用的RPC框架,包括但不限于RMI、dubbo、Hessian、Spring Remoting框架。这篇文章将简要介绍Java语言自带的RMI协议。 RMI(Remote Method Invocation),远程方法调用,程序调用方无需关心跨机器跨进程的协议调用,更多的把精力放在业务上,而且这也隐藏了服务器实现的细节。 ...
2018-05-21 11:44:12
1621
原创 Ocean设计思路和架构设计
最近看了杨传辉的《大规模分布式存储系统:原理解析与架构实战》,里面讲了分布式文件系统的经典设计案例和oceanbase的整体设计,看完之后,对于分布式系统的理解有了一个新的层次。单机系统首先将一下我们接触比较多的单机系统。对于一些业务很小流量不大的系统,我们经常只会给应用部署到一个机器上。在这个系统上,无论是内存,网络还是处理器处理数据,都可以满足部署的小系统,由于小系统的流量不大,所以承载的压力...
2018-04-17 18:17:13
1315
原创 解决亚马逊调用频率限制问题的sdk框架
先给急着用的人:项目地址:https://github.com/zhuzhenke/invoke-limit-api针对调用亚马逊AWS服务,对于亚马逊针对每个接口有不同的频率调用限制,设计了这个对调用者可以同步和异步调用的sdk框架,把因为频率限制的错误进行重试的封装,调用调用者处理因频率限制出现的错误。这里主要基于xMemcachedClient开源项目的一些设计优点,结合现有业务难点设计的基...
2018-03-27 23:26:41
5498
原创 Mysql explain-Extra(using where,using index)使用详解
下面是测试用例,楼主的测试使用的MySQL版本是5.6.27-log。show create table user_man;CREATE TABLE `user_man` ( `manid` bigint(20) NOT NULL AUTO_INCREMENT, `manname` varchar(32) DEFAULT NULL, `manage` int(6) DEFAULT NULL...
2018-03-13 11:27:48
7267
原创 Mysql explain-type使用详解
下面是测试用例,楼主的测试使用的MySQL版本是5.6.27-log。show create table user_man;CREATE TABLE `user_man` ( `manid` bigint(20) NOT NULL AUTO_INCREMENT, `manname` varchar(32) DEFAULT NULL, `manage` int(6) DEFAULT NULL...
2018-03-13 11:26:30
1463
原创 Spring IOC循环依赖解决方案分析
Spring IOC循环依赖解决方案分析这里Spring主要用了三层缓存来完成对循环依赖的实现。下面的属性来源于DefaultSingletonBeanRegistry类 /** Cache of singleton objects: bean name --> bean instance */ private final Map<String, Object> singlet...
2018-03-11 13:28:09
8267
原创 ConcurrentSkipListMap高并发原理探究和源码分析
TreeMap、ConcurrentSkipListMap的关系TreeMap是支持key有序排列的一个key-value数据结构,不过是在单线程情况下使用,并发下不是线程安全的。ConcurrentSkipListMap是基于跳表的实现,也是支持key有序排列的一个key-value数据结构,在并发情况下表现很好,是一种空间换时间的实现,ConcurrentSkipListMap是基于一种乐观锁...
2018-03-01 14:05:47
1582
原创 内部类实现原理
关于内部类的定义和使用,这里不做过多介绍,不太清楚的请先行了解。自己写了一个类,里面有内部类和局部内部类。通过javac和javap去了解内部类的大体实现过程。先附上代码public class Use { private String name; private Integer age; public Integer getAge() { return...
2018-02-18 23:21:18
3429
原创 Dubbo Filter原理和使用场景
Dubbo Filter是为了开发者在未全局方法调用时统一添加额外参数时使用到的。主要场景有:1、传递线程上下文信息2、方法上的共同参数统一传递,避免每次方法调用时去设置比如:一个web应用有会话信息,这个web应用需要调用另外一个dubbo服务(这里是内部管理比较紧密的项目),这时提供dubbo服务这个项目,想要获取当前调用的用户会话信息,方便记录日志,这个时候使用Dub
2018-01-08 16:53:59
3465
原创 Java SPI机制原理和使用场景
SPI的全名为Service Provider Interface.这个是针对厂商或者插件的。一般来说对于未知的实现或者对扩展开放的系统,通常会把一些东西抽象出来,抽象的各个模块,往往有很多不同的实现方案,比如日志模块的方案,xml解析模块、jdbc模块的方案等。这个可以通过我们的抽象工厂方法来理解这个含义,实现是可以又厂商或者开发人员自己实现。由于代码上是处于上层的一个封装者,是不会知道底层怎么...
2018-01-08 16:46:15
10335
原创 从Socket编程看HTTP服务器设计
从常用的telnet命令,了解Socket的设计和用途。我们会经常使用telnet来测试一个ip上某个端口是否能够连得通,这里中间其实就是利用socket连接返回数据。这里我们在linux服务器上输入telnet taobao.com 80命令后,得到了Connected to taobao.com的相应,说明了这样的一个连接是正常的,服务器返回了响应。上面的一个大体的过程就是类似我们java中的...
2017-12-29 19:32:43
433
原创 非对称加密RSA算法解密
本文将从RSA加密解密过程,详细介绍RSA非对称加密算法的原理。RSA算法用到了大学数学中的一些定理和概念欧拉定理欧几里得定理模逆元概念java使用示例public static void main(String[] args) throws Exception { rrss(); } public static void rrss() throws Except...
2017-12-29 19:30:39
488
原创 mysqldump原理分析
测试库:mysqldump_test命令:mysqldump -u root -p mysqldump_test > /User/admin/Desktop/mysqldump_test.sql准备工作:1、创建一个mysqldump_test的数据库 CREATE DATABASE `mysqldump_test` /*!40100 DEFAULT CHAR
2017-12-10 10:30:33
452
原创 mysql 建表设计建议
这里的建表建议是在MySQL数据库的innodb存储引擎下使用。1、一定要设置主键,且主键尽量用自增ID去实现。对于innodb,并没有强制我们使用主键,但是其实innodb内部的实现是必定含有主键的,因为我们的数据是存放在主键索引的B+树上的。对于没有建立主键的表,innodb会默认生成一个主键,但是这个主键我们是不可见的。而使用主键我们尽量用int或者bigint类型为主键,并且设置为自增。这...
2017-12-09 09:07:58
3215
1
原创 Java wait()和await() notify()和signal() notifyAll()和signalAll()了解和区别
Java wait()和await() notify()和signal() notifyAll()和signalAll()了解和区别
2017-11-03 07:35:20
7488
1
原创 sping代码优化建议
这里提两点我项目中真正用到的建议,后面会陆续把其他的分享出来。1、controller返回数据大体格式在BaseController统一定义例如返回给前端的格式是{"data":{},code:0}那么我们可以统一在BaseController中定义一个方法public final Object data(Onject object){ JSONObject json = new J...
2017-10-11 15:29:40
620
原创 Java并发知识点汇总
Java并发知识点汇总Java并发相关的教程很多,其一是并发一直是开发人员必备技能,其二是并发本身涉及内容较多。但是网上关于Java并发相关的博客均比较散乱,没有自成一体。本文尝试从并发知识体系上相关的做一个汇总,并推荐2-3篇在这个技能点上写得好的文章。并发这块建议大家在下面的博客指导下多看看源码,了解一下Doug Lea并发大师的并发思想,让自己在编码过程中有更多经验的指导。由于技能点太多...
2017-09-22 11:22:34
11815
1
原创 正确理解Spring事务和数据库事务和锁
Lock wait timeout exceeded; try restarting transaction解决方案
2017-09-20 21:59:02
51393
3
原创 如果 TCP 协议中三次握手不携带序列号,会造成什么样的后果
之所以需要三次握手,其实就是要双方相互确认彼此能够通信。一般要与对方确认可以通信,就要确认自己能够跟对方通信(1),且能够收到对方的通信(2),反过来对方也能够和自己通信(3),且能收到自己的通信(4)。基于这一点,流程就简化为3次握手通信。首先,client发送一个SYN=1,seq=X(X随机);到server,server收到这个消息,则确认了client能够与ser
2017-08-30 09:54:47
18542
1
原创 从NoSuchMethodError看jvm编译和class加载方式
今天在写自己的项目的时候出现了一个Exception in thread "main" java.lang.NoSuchMethodError的异常,但是我的代码在编译过程中是没有任何问题的。先来讲一下我的项目关键的结构我的项目引用了两个jar包,暂定为jarA(version:1.0)和jarB(version:2.0),但是jarA中又引用了jarB(version:1.0),
2017-08-16 21:33:02
36214
2
原创 Netty的基础架构模型
Netty是高性能的异步非阻塞NIO框架!下面先来理解一下两组关键的概念。同步和异步拿方法调用来说,同步是指调用一个方法能够在方法结束时立即得到方法的结果,异步就是方法调用时没有返回结果,由另外的线程去做方法中的事情,当前线程可以去做其他的事情。异步调用的结果会通过中间状态改变或者回调函数等来通知。拿一个生活的例子来说,同步就好比你去小区附近的一个4S点修车,老板在帮你修车,你一直在旁边等老板修好...
2017-08-14 00:24:21
6676
《 从NoSuchMethodError看jvm编译和class加载方式》的测试项目代码
2017-08-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人