自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 Java多线程——ReentrantReadWriteLock源码阅读

之前讲了《AQS源码阅读》和《ReentrantLock源码阅读》,本次将延续阅读下ReentrantReadWriteLock,建议没看过之前两篇文章的,先大概了解下,有些内容会基于之前的基础上阅读。这个并不是ReentrantLock简单的升级,而是落地场景的优化,我们来详细了解下吧。背景JUC包里面已经有一个ReentrantLock了,为何还需要一个ReentrantReadWr...

2019-09-04 14:43:51 129

原创 Java多线程——AQS框架源码阅读

AQS,全称AbstractQueuedSynchronizer,是Concurrent包锁的核心,没有AQS就没有Java的Concurrent包。它到底是个什么,我们来看看源码的第一段注解是怎么说明看完第一段,总结下AQS是一个同步的基础框架,基于一个先进先出的队列。 锁机制基于一个状态值,它是原子值。 AQS的子类负责定义与操作这个状态值,但必须通...

2019-09-04 14:14:08 114

原创 对Java中HashCode方法的深入思考

|0前言最近在学习 Go 语言,Go 语言中有指针对象,一个指针变量指向了一个值的内存地址。学习过 C 语言的猿友应该都知道指针的概念。Go 语言语法与 C 相近,可以说是类 C 的编程语言,所以 Go 语言中有指针也是很正常的。我们可以通过将取地址符&放在一个变量前使用就会得到相应变量的内存地址。package mainimport "fmt"func main(...

2019-08-30 18:14:23 141

原创 你真的完全了解Java动态代理吗

动态代理看起来好像是个什么高大上的名词,但其实并没有那么复杂,直接从字面就很容易理解。动态地代理,可以猜测一下它的含义,在运行时动态地对某些东西代理,代理它做了其他事情。先不去搞清楚这个动态代理真正的含义,我们来举个生动的例子来理解下它到底做了什么。一个例子一个程序员Developer,他会开发code,他调试debug。程序员有很多分类,其中有Java程序员JavaDevelo...

2019-08-30 18:14:15 160

原创 从源码入手,一文带你读懂Spring AOP面向切面编程

之前《零基础带你看Spring源码——IOC控制反转》详细讲了Spring容器的初始化和加载的原理,后面《你真的完全了解Java动态代理吗?看这篇就够了》介绍了下JDK的动态代理。基于这两者的实现上,这次来探索下Spring的AOP原理。虽然AOP是基于Spring容器和动态代理,但不了解这两者原理也丝毫不影响理解AOP的原理实现,因为大家起码都会用。AOP,Aspect Oriented...

2019-08-30 18:13:42 124

原创 零基础带你看Spring源码——IOC控制反转

本章开始来学习下Spring的源码,看看Spring框架最核心、最常用的功能是怎么实现的。网上介绍Spring,说源码的文章,大多数都是生搬硬推,都是直接看来的观点换个描述就放出来。这并不能说有问题,但没有从一个很好的、容易切入的角度去了解学习。博主来尝试抛弃一些所知,从使用上入手,步步回溯源码去了解学习。很多人会混乱IOC和DI的两个概念,其实这两者是层面的不同。具体的区别的区别:IOC...

2019-08-30 18:13:32 99

原创 “过时”的SpringMVC我们到底在用什么?深入分析DispatchServlet源码

之前已经分析过了Spring的IOC(《零基础带你看Spring源码——IOC控制反转》)与AOP(《从源码入手,一文带你读懂Spring AOP面向切面编程》)的源码,本次就来分析下SpringMVC。本文先简述下目前SpringMVC的使用情况,然后通过Demo的简单让大家有一个初步的使用印象,然后带着印象去看其中执行的分发源码。到底什么是Spring MVC,我们还在用吗?Sprin...

2019-08-30 18:12:39 180

原创 拜托!面试请不要再问我Spring Cloud底层原理

|0概述毫无疑问,Spring Cloud是目前微服务架构领域的翘楚,无数的书籍博客都在讲解这个技术。不过大多数讲解还停留在对Spring Cloud功能使用的层面,其底层的很多原理,很多人可能并不知晓。因此本文将通过大量的手绘图,给大家谈谈Spring Cloud微服务架构的底层原理。实际上,Spring Cloud是一个全家桶式的技术栈,包含了很多组件。本文先从其最核心的几个组件...

2019-08-30 18:12:27 161

原创 都9102年了,还不会Docker?10分钟带你从入门操作到实战上手

Docker简述Docker是一种OS虚拟化技术,是一个开源的应用容器引擎。它可以让开发者将应用打包到一个可移植的容器中,并且该容器可以运行在几乎所有linux系统中(Windows10目前也原生支持,Win10前需要内置虚拟机),正所谓“一次打包,到处运行”。Docker容器的运行是完全的沙箱机制,相互之间不会有任何关联(除非自己串联集群)。网络、存储、进程等资源,不仅对于不同的容器是相...

2019-08-30 18:12:03 118

原创 进阶的Redis之哈希分片原理与集群实战

前面介绍了《进阶的Redis之数据持久化RDB与AOF》和《进阶的Redis之Sentinel原理及实战》,这次来了解下Redis的集群功能,以及其中哈希分片原理。集群分片模式如果Redis只用复制功能做主从,那么当数据量巨大的情况下,单机情况下可能已经承受不下一份数据,更不用说是主从都要各自保存一份完整的数据。在这种情况下,数据分片是一个非常好的解决办法。Redis的Cluster正...

2019-08-30 18:11:49 149

原创 进阶的Redis之数据持久化RDB与AOF

大家都知道,Redis之所以性能好,读写快,是因为Redis是一个内存数据库,它的操作都几乎基于内存。但是内存型数据库有一个很大的弊端,就是当数据库进程崩溃或系统重启的时候,如果内存数据不保存的话,里面的数据就会丢失不见了。这样的数据库并不是一个可靠的数据库。所以数据的持久化是内存型数据库的重中之重。它不仅提供数据保存硬盘的功能,还可以借此用硬盘容量扩展数据存储空间,使得Redis的可以存储超...

2019-08-30 18:11:41 110

原创 进阶的Redis之Sentinel原理及实战

Redis作为一款高效的内存数据库,可作用于方方面面,相信如今项目的开发都离不开它。大家可能都知道Redis是高可用的,但很少知道具体高可用是利用什么去实现的。抛两个问题:只部署一个Redis实例,如果这个实例挂了就无法读写数据了,那怎么做实例备份? 部署了两个Redis,一主一从做复制,从只读,如果主挂了,那这个服务还怎么正常对外服务?显然,要做到高可用,首先要有足够多的Redis实...

2019-08-30 18:11:17 175

原创 线程数究竟设置多少合理

|0需求缘起Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设置为CPU核数的8倍,有些业务设置为CPU核数的32倍。“工作线程数”的设置依据是什么,到底设置为多少能够最大化CPU性能,是本文要讨论的问题。2|0一些共性认知在进行进一步...

2019-08-29 02:21:13 268

原创 分析Java延迟与周期任务的实现原理

延迟或周期执行任务可以使用Timer或者ScheduledThreadPoolExecutor,前者可以抛弃,后者是今天的主角。ScheduledThreadPoolExecutor继承了ThreadPoolExecutor,对应执行任务变成ScheduledFutureTask。本文会在前三篇分析线程池原理的基础上,分析ScheduledThreadPoolExecutor的实现原理,最后介...

2019-08-29 01:48:44 270

原创 分析同步工具Semaphore和CyclicBarrier的实现原理

前两篇分别通过ReentrantLock和CountDownLatch分析了AQS的独占功能和共享功能。除CountDownLatch之外,还有Semaphore和CyclicBarrier,前者类似CountDownLatch使用AQS实现,后者使用ReentrantLock实现,本文分析一下。信号量Semaphore直接用个小例子描述信号量的用法:final Semaphore ...

2019-08-29 01:24:15 158

原创 分析CountDownLatch的实现原理

上一篇通过研究ReentrantLock分析了AQS的独占功能,本文将通过同样是AQS子类的CountDownLatch分析AQS的共享功能。有了前文研究独占功能的基础,再研究共享锁就简单多了。CountDownLatch的使用CountDownLatch是同步工具类之一,可以指定一个计数值,在并发环境下由线程进行减1操作,当计数值变为0之后,被await方法阻塞的线程将会唤醒,实现线程间...

2019-08-29 01:15:56 98

原创 分析ReentrantLock的实现原理

前几篇文章分析了线程池的原理,接下来研究锁的方面。显式锁ReentrantLock和同步工具类的实现基础都是AQS,所以合起来一齐研究。什么是AQSAQS即是AbstractQueuedSynchronizer,一个用来构建锁和同步工具的框架,包括常用的ReentrantLock、CountDownLatch、Semaphore等。AQS没有锁之类的概念,它有个state变量,是个in...

2019-08-29 01:05:12 69

原创 分析Java线程池Callable任务执行原理

上一篇分析了线程池的执行原理,主要关于线程池的生命周期和任务如何在池里创建、运行和终止。不过上次研究的是execute方法,执行的是Runnable任务,它不返回任何值。如果希望任务完成后返回结果,那么需要使用Callable接口,这也是本文要研究的主题。ExecutorService es = Executors.newSingleThreadExecutor();Future<?...

2019-08-29 00:57:14 255

原创 分析Java线程池执行原理

上一篇已经对线程池的创建进行了分析,了解线程池既有预设的模板,也提供多种参数支撑灵活的定制。本文将会围绕线程池的生命周期,分析线程池执行任务的过程。线程池状态首先认识两个贯穿线程池代码的参数:runState:线程池运行状态 workerCount:工作线程的数量线程池用一个32位的int来同时保存runState和workerCount,其中高3位是runState,其余29...

2019-08-29 00:50:07 115

原创 分析Java线程池的创建

最近在改进项目的并发功能,但开发起来磕磕碰碰的。看了好多资料,总算加深了认识。于是打算配合查看源代码,总结并发编程的原理。准备从用得最多的线程池开始,围绕创建、执行、关闭认识线程池整个生命周期的实现原理。后续再研究原子变量、并发容器、阻塞队列、同步工具、锁等等主题。java.util.concurrent里的并发工具用起来不难,但不能仅仅会用,我们要read the fucking sourc...

2019-08-29 00:40:01 81

原创 分析jdk-1.8-ForkJoinPool实现原理(下)

上篇介绍了ForkJoinPool的基本结构和参数,本篇进入代码细节,一窥ForkJoinPool的实现原理。整个流程和重要方法归纳如下:任务提交提交任务入口:submit,execute,invoke 完整版提交任务:externalSubmit(包括初始化) 简单版提交任务:externalPushworker管理激活或创建:signalWork 创建:tryAddW...

2019-08-29 00:24:09 289

原创 分析jdk-1.8-ForkJoinPool实现原理(上)

看Kotlin的协程时,看到内部实现使用了ForkJoinPool,它实现于ExecutorService,但又和我们常用的ThreadPoolExecutor原理不同,是另一种实现方式。顾名思义,ForkJoinPool运用了Fork/Join原理,使用“分而治之”的思想,将大任务分拆成小任务分配给多个线程执行,最后合并得到最终结果,加快运算。图1 Fork/Join最核心的思想可以...

2019-08-29 00:15:36 417

原创 Java7 和 Java8 中的 ConcurrentHashMap 原理解析

|0Java7 中 ConcurrentHashMapConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它支持并发操作,所以要复杂一些。整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表”部分“或”一段“的意思,所以很多地方都会将其描述为分段锁。注意,行文中,我很多地方用了“槽”来代表一个 segment。...

2019-08-28 01:35:44 89

原创 Java 7 和 Java 8 中的 HashMap原理解析

HashMap 可能是面试的时候必问的题目了,面试官为什么都偏爱拿这个问应聘者?因为 HashMap 它的设计结构和原理比较有意思,它既可以考初学者对 Java 集合的了解又可以深度的发现应聘者的数据结构功底。阅读前提:本文分析的是源码,所以至少读者要熟悉它们的接口使用,同时,对于并发,读者至少要知道 CAS、ReentrantLock、Unsafe 操作这几个基本的知识,文中不会对这些知识进...

2019-08-28 00:32:24 80

原创 对Java中HashCode方法的深入思考

|0前言最近在学习 Go 语言,Go 语言中有指针对象,一个指针变量指向了一个值的内存地址。学习过 C 语言的猿友应该都知道指针的概念。Go 语言语法与 C 相近,可以说是类 C 的编程语言,所以 Go 语言中有指针也是很正常的。我们可以通过将取地址符&放在一个变量前使用就会得到相应变量的内存地址。package mainimport "fmt"func main(...

2019-08-27 23:39:00 97

原创 Spring循环依赖的三种方式

|0什么是循环依赖?循环依赖其实就是循环引用,也就是两个或则两个以上的 Bean 互相持有对方,最终形成闭环。比如A依赖于B,B依赖于C,C又依赖于A。如下图:如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错。下面说一下Spring是如果解决循环依赖的。注意,这里不是函数的循环调用,是对象的相互依赖关系。循环调用其实就...

2019-08-27 23:00:18 66

原创 Elasticsearch 技术分析(八):剖析 Elasticsearch 的索引原理

|0前言创建索引的时候,我们通过Mapping 映射定义好索引的基本结构信息,接下来我们肯定需要往 ES 里面新增业务文档数据了,例如用户,日志等业务数据。新增的业务数据,我们根据 Mapping 来生成对应的倒排索引信息 。我们一直说,Elasticsearch是一个基于Apache Lucene 的开源搜索引擎。Elasticsearch的搜索高效的原因并不是像Redis那样重依...

2019-08-27 02:32:12 79

原创 Elasticsearch 技术分析(七): Elasticsearch 的性能优化

|0硬件选择Elasticsearch(后文简称 ES)的基础是 Lucene,所有的索引和文档数据是存储在本地的磁盘中,具体的路径可在 ES 的配置文件../config/elasticsearch.yml中配置,如下:# ----------------------------------- Paths ------------------------------------...

2019-08-27 02:23:19 541

原创 Elasticsearch 技术分析(六): 自动发现机制 - Zen Discoveryedit

|0发现方式Zen discovery是内建的、默认的、用于Elasticsearch的发现模块。它提供了单播和基于文件的发现,可以通过插件扩展到支持云环境和其他形式的发现。Zen Discovery 是与其他模块集成的,例如,节点之间的所有通信都使用transport模块完成。某个节点通过发现机制找到其他节点是使用Ping的方式实现的。Zen Discovery 使...

2019-08-27 01:37:58 167

原创 Elasticsearch 技术分析(四): 分布式工作原理

|0前言通过前面章节的了解,我们已经知道 Elasticsearch 是一个实时的分布式搜索分析引擎,它能让你以一个之前从未有过的速度和规模,去探索你的数据。它被用作全文检索、结构化搜索、分析以及这三个功能的组合。 Elasticsearch 可以横向扩展至数百(甚至数千)的服务器节点,同时可以处理PB级数据。虽然说 Elasticsearch 是分布式的,但是对于我们开发者来说并未...

2019-08-27 01:27:11 103

原创 Elasticsearch基础但非常有用的功能之一:别名

0、题记本文是系列文章第一篇。介绍Elasticsearch的一些非常基础但实战开发确非常有用的技术点。了解这些技术点会帮助你设计更易于维护的数据索引,预先知道PB级大数据索引实战中的坑,提升工作效率。本文从别名分类、索引别名实践、索引别名的好处、索引别名常见问题及坑解读、字段别名实践一把 五个方面进行详细解读。1、别名分类别名在Elasticsearch中有两种分类。1.1 ...

2019-08-27 00:54:21 267

原创 Elasticsearch 技术分析(二): 索引映射Mapping问题

数据库建表的时候,我们的DDL语句一般都会指定每个字段的存储类型,例如:varchar,int,datetime等等,目的很明确,就是更精确的存储数据,防止数据类型格式混乱。CREATE TABLE `shop_` ( `id_` varchar(36) NOT NULL COMMENT 'id', `shop_name_` varchar(50) DEFAULT NULL COMM...

2019-08-27 00:19:41 163

原创 Elasticsearch 技术分析(一): 基础入门

|0简介Elasticsearch是一个高度可扩展的、开源的、基于 Lucene 的全文搜索和分析引擎。它允许您快速,近实时地存储,搜索和分析大量数据,并支持多租户。Elasticsearch也使用Java开发并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。不...

2019-08-26 23:56:03 160

原创 全文搜索引擎 ElasticSearch 还是 Solr?

最近项目组安排了一个任务,项目中用到了全文搜索,基于全文搜索 Solr,但是该 Solr 搜索云项目不稳定,经常查询不出来数据,需要手动全量同步,而且是其他团队在维护,依赖性太强,导致 Solr 服务一出问题,我们的项目也基本瘫痪,因为所有的依赖查询都无结果数据了。所以考虑开发一个适配层,如果 Solr 搜索出问题,自动切换到新的搜索--ES。其实可以通过 Solr 集群或者服务容错等设计来解...

2019-08-26 23:29:23 129

ElasticSearch入门到精通

0.介绍1.应用场景2.系统架构3.核心思想4.性能5.存储流程6.查询流程搜索引擎是对数据的检索,所以我们先从生活中的数据说起。我们生活中的数据总体分为两种: 结构化数据 非结构化数据 结构化数据:也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。指具有固定格式或有限长度的数...

2019-08-26 02:36:32 194

转载 安装ZooKeeper(单机、伪集群、集群)

安装ZooKeeper(单机、伪集群、集群)博客分类: 大数据平台架构移动互联网关键字:安装ZooKeeper(单机、伪集群、集群) 推荐学习列表: zookeeper jvm设置:http://www.th7.cn/Program/java/201408/267970.shtml zookeeper java应用场景和实现:http://www.ibm.com/developerworks/cn...

2018-04-17 18:12:08 310

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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