自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

wthfeng的专栏

我的架构师成长之路 http://blog.wthfeng.com

  • 博客(85)
  • 资源 (2)
  • 收藏
  • 关注

原创 一文深入分析AQS(原理篇)

之前写过AQS的文章 AbstractQueuedSynchronizer整体解析),当时只是简单介绍了下,没有涉及源码分析和实现细节,但这毕竟是java同步中最重要的类,于是重写了部分内容,添加了源码分析和其他细节。本文分成两个部分,第一部分从整体上分析AQS的实现机制和原理,第二部分深入源码探究。好了,那就开始吧整体介绍从AQS类的注释中,我们可以了解到:该类是一个用于构建锁或其他同步器的基础框架,使用一个int的成员变量表示同步状态。另外,还有一个内置的先进先出的队列可储存竞争同步状态时排队的线

2021-06-09 14:44:35 970

原创 深入源码剖析spring实现原理

spring的重要性不用多说了,本文从源码角度深入分析spring的实现原理和一些关键点。争取一篇文章让你对spring有更整体深刻的理解。一、整体分析在分析源码之前,先从整体上了解下spring,这对后面源码分析是很重要的。注:本文基于目前(2021-6)spring最新版本5.3.7我们知道spring主要特性是ioc和aop,而这两者中最重要的还是ioc,它提供了管理bean的容器,其他特性都是基于此容器的。那么要了解spring,主要是看看它是怎么构建ioc的。找到bean定义根据

2021-06-06 23:54:08 650 5

原创 redis 缓存穿透等问题解决方案

在使用redis中可能会发生以下情况:缓存出现的问题缓存穿透访问redis一个(或多个)不存在的数据,击穿redis到达DB。查询DB仍返回空。大量这样的访问可能会使DB崩溃。缓存雪崩缓存系统同一时间有大量数据失效。大量数据打到DB使DB压力过大。缓存并发和上面类似,不过这个是当一个key过期时大量请求打到DB。解决方法以上三种情况区别在于缓存穿透是恶意的,即通过大量构造不存在的...

2019-02-19 20:19:48 559

原创 AbstractQueuedSynchronizer整体解析

AbstractQueuedSynchronizer整体解析前言在此之前,我们深入源码分析过ReentrantLock系列,在那里就探讨过AbstractQueuedSynchronizer(下称AQS)类,称其是同步组件乃至整个并发包的基础类。这篇文章就深入AQS,从AQS的角度了解同步器以及ReentrantLock、ReentrantReadWriteLock等的实现机制,实现自定义的同步组件

2017-12-10 23:11:57 473 2

原创 ReentrantLock原理探究(一)

前言ReentrantLock类是synchronized语义的替代品,可以实现与其相同的功能,了解其实现原理对并发编程无疑是很有帮助的。其次,ReentrantLock 的实现基础AQS(AbstractQueuedSynchronizer)也是java并发编程中相当重要的一个类,所以无论如何,我们都要了解一番。

2017-05-21 10:16:32 1228 3

原创 java的内存模型与volatile关键字详解

由于各种硬件及操作系统的内存访问差异,java虚拟机使用java内存模型(java Memory Model,JMM)来规范java对内存的访问。这套模型在jdk 1.2中开始建立,经jdk 1.5的修订,现已逐步完善起来。什么是java内存模型什么是java内存模型,为什么会有这个模型?关于这个问题,就不得不从并发的问题讲起。在多核系统中,处理器一般设置缓存来加速数据的读取,缓存大大提升了程序性能

2017-02-05 10:19:48 2467

原创 安装minikube网络访问问题解决

minikube出现网络下载问题,使用国内的镜像仓库代理即可,具体可使用minikube start --help 查看说明文档

2022-10-06 14:39:29 1333

原创 Thread的join()方法解析

一般用join方法实现主线程等待其他异步线程完成,今天就看看它到底是咋实现的。先看下示例 // 子线程 static class SleepThread implements Runnable { @Override public void run() { try { System.out.println("子线程开始"); Thread.sleep(1000);

2021-06-08 12:45:40 431

原创 关于网上一个jedisLock锁问题的探讨

关于网上一个jedisLock锁问题的探讨前言前段时间项目有关redis分布式锁的代码经常出现锁超时的情况,经排查终于发现了个隐藏的问题,现记录下来以备忘。问题复现引用的jedis锁项目是 <groupId>com.github.jedis-lock</groupId> <artifactId>jedis-lock</artifactId> <version>1.0.0</version>项目很简单,就一个java类,

2021-04-22 23:19:39 489

原创 mysql加锁分析(一)等值查询

mysql加锁分析(一)等值查询等值查询的加锁分析相对简单,这篇先从等值查询开始。前言先确认本篇内容,分析在RC(读已提交)和RR(可重复读)下关于等值查询的加锁分析。关于范围查询待下篇讲起。mysql默认的隔离级别是RR。隔离级别的查询及调整如下:select @@global.transaction_isolation; ## 查询全局事务隔离级别select @@session.transaction_isolation; ## 查询会话事务隔离级别set session(glob

2021-04-22 23:17:34 1083

原创 mysql的InnoDB和MyISAM引擎区别

InnoDB特点:行级锁支持事务处理支持外键,使用B+树。聚集索引主键mysql5.6版本开始支持已全文索引InnoDB中数据文件本身就是索引文件。索引也使用B+树实现,叶子节点储存数据。索引文件本身需要按主键构建(所以InnoDB需要必须有主键,没有指定会默认生成)。InnoDB的辅助索引底层储存的是主键的值。然后再根据主键的值去主键索引(也相当于数据文件)去查找相应的值。...

2019-04-16 19:52:51 312

原创 数据库事务总结与整理(一)

前言提数据库就会讲到数据库的事务问题,常见的一个问题就是:你的数据库是如何保证事务的?这里的数据库可以是关系型数据库,如mysql,或者是非关系型的,如MongoDB或是其他数据库。令人头疼的是,这样的问题很常见却不知怎么回答,一个原因是没有涉及过事务相关的操作,还有项目中有事务,往往也是一个注解搞定,根本不深入。今天就来全面总结下有关事务的问题。事务的若干概念ACID特性一般来说,事务具...

2019-04-16 19:30:12 485

原创 java的异常、finally和return

前言本文主要讲解java的异常体系及有关finally和return的返回问题。继承体系java中所有异常类的基类都是Throable类。它的两大子类分别是Error和Exception。Error表示错误,是程序处理不了的。Exception类又分为运行时异常(RuntimeException异常)和非运行时异常(或称为受检异常)。顾名思义,运行时异常是程序在运行时才能被检查出来的异常,...

2019-04-16 12:53:38 1429 2

原创 java基础体系整理(三)Spring框架相关

前言本文spring框架相关知识包括Spring、Spring MVC,Spring Boot 以及Mybatis,Hibernate等常见与Spring集成相关的框架。常见问题对Spring IOC、AOP的理解AOP的实现方式都有哪些?AOP中切面、切点是指什么?Spring MVC请求流程,拦截器在哪里执行的? 监听器是指什么?Mybatis中怎样在一次插入中返回该行主键(如...

2019-04-06 20:55:20 436

原创 关于HashMap在高并发下的问题

前言总所周知,HashMap不是线程安全的,在高并发情况下会出现问题。特别是,在java1.7中,多线程的HashMap会出现CPU 100%的严重问题。这个问题是怎样产生的,后续版本还会有这个问题吗(指java8及后续版本)?下面就来用通俗的语言讲解下。解析关于这个问题,是由于java7多线程扩容机制下链表变为循环链表,再获取该链表导致的。看下java7中扩容的代码。java7中Hash...

2019-04-02 15:23:38 1617

原创 java知识体系整理(二)JVM、GC回收及调优

本部分涉及JVM内存结构及GC算法,java调优等知识。JVMJVM内存结构划分(堆、栈、方法区、程序计数器等)标记清除、标记整理及复制算法。常用GC参数常见垃圾回收器及优缺点程序CPU 100%怎样排查?常见的JVM工具有哪些JVM优化栈上分配 当开启逃逸分析后,JVM会把确定不会溢出的对象放到栈上分配,是JVM的一项优化技术,基本思想是对线程私有的对象将他们打散分...

2019-04-01 21:44:54 460

原创 java知识体系整理(一)基础知识

基础知识基础知识主要涉及java语法及常见知识点。包括IO、类加载,反射、注解、异常,集合类等。下面以这几个大类分别做汇总,并引出其中若干小问题。知识梳理java的集合体系及继承关系,以及主要类的用法及原理。java类加载机制BIO与NIO、AIO区别及联系,什么是Reactor模型。异常类继承关系,受检异常和非受检异常。反射知识梳理。其他java特性(枚举,注解,synchro...

2019-04-01 20:39:08 6231 1

原创 zookeeper笔记摘要

zookeeper不能基于临时节点创建子节点,临时节点只能作为叶子节点。节点版本表示节点自创建后变更次数。客户端当发生网络问题会自动重连,会是CONNECTED和CONNECTING两者之一。服务器是根据配置文件中服务器个数确定是启动集群模式还是单机模式。在刚启动时状态是LOOKING,选举状态。(此状态认为当前集群没有leader,会进入选举状态,尝试向其他节点发送投票信息)进入选举...

2019-03-27 21:24:26 314

原创 zookeeper 原理简介随笔

zookeeper 原理简介随笔两部分: 文件系统和通知机制。文件系统,全量数据存于内存。zk主要有2种节点类型,临时节点和持久节点。又细分为普通临时节点顺序临时节点普通持久节点顺序持久节点临时节点的生命周期和客户端一致。如果客户端会话失效,则节点会被自动销毁。临时节点没有子节点顺序节点中,只会为其直接子节点维持顺序二阶段提交协议分为事务询问和执行事务两个部分。...

2019-02-27 20:48:05 267

原创 MySQL数据库InnoDB与MyISAM区别

数据库存储引擎区别### InnoDB特点: 行级锁,支持事务处理,支持外键,行锁实现,根据索引条件检索数据使用行锁。MyISAM表锁,支持全文索引。表锁,分为表共享锁和表独占锁。读和读之间使用共享锁,读写之间使用独占锁。数据结构B树,又称多路平衡查找树。所有节点中孩子节点的最大值为此树的阶(用m表示)。每个节点关键字的个数最少有[m/2-1]个,最多有[m-1]个。也即一个m为4...

2019-02-26 12:25:43 2304

原创 BIO、NIO以及AIO特点及比较

BIO、NIO以及AIO特点及比较BIO传统阻塞式IO的瓶颈在于每个连接都要创建线程,当连接过多时不能处理大量连接。讨论为什么传统IO会阻塞?首先说明一下socketsocket是支持TCP/IP网络通信的基础,是网络通信端点的抽象表示。可以使用5元组表示socket。为 协议,源ip,源port,目标ip,目标port。协议可选TCP或UDP,是TCP/IP协议的封装和应用。soc...

2019-02-20 21:52:16 1054

原创 mongoDB 笔记随笔(一)

可复制集mongoDB可复制集本质上是对主从复制模型的增强。在主从复制的基础上增加了自动化切主、平滑迁移的功能。最小的可复制集群至少有3个节点,主、从节点和一个裁判节点。裁判节点不包含数据,只在主节点down后进行重新选主操作。构建可复制集群构建一个包含3个节点的集群。一个主节点,一个从节点,一个裁判节点。mongod --replSet myrepl --dbpath /data/d...

2019-02-11 11:56:52 361

原创 Flume简要说明笔记

## 前言flume是Apache旗下的开源日志收集、传输框架(由Cloudera于2009年捐赠)。可支持收集来自文本、HDFS、HBase等多种数据源的日志记录,并可传输到多种数据源。由于其稳定的性能及表现,目前已被广泛采用。主体介绍Event(事件)是Flume的基本传输单元,可理解为传输的数据如日志等。Agent是Flume的核心运行逻辑。一个Agent就是一个完整的数据收集工具(...

2018-11-18 20:28:52 305

原创 java I/O体系总结(五)netty架构浅析

java I/O体系总结(五)netty架构浅析简介netty是使用java编写的高性能IO框架,旨在为高并发场景提供支持。netty可提供多种IO模型的支持,如OIO,NIO等。一般来说,非阻塞IO更适合于大规模高并发场景,我们使用netty主要也因为其封装了原生NIO,规避了其中复杂易出错的细节,更加易用、通用。从示例讲起netty既然是以java NIO为基础构建的(当然...

2018-09-17 17:41:19 286

原创 java I/O体系总结(四) 使用socket构建HTTP服务器

java I/O体系总结(四) 使用socket构建HTTP服务器前言在 java I/O体系总结(三)中,已使用阻塞和非阻塞的方式分别构建了一个简单的服务器。HTTP作为Web浏览器和Web服务器之间通信的标准协议,在网络编程中有也重要位置。下面就深入HTTP协议,尝试使用NIO构建简单的HTTP服务器。HTTP协议我们都知道,HTTP协议是应用层协议,全称超文本传输协议...

2018-09-14 18:04:54 310

原创 java I/O体系总结(二) java IO补充

java I/O 体系总结二前言继续说java的I/O体系,主要补充下上文没有提到的知识点或类。java有关io的类在java.io包中。主要有以下几个部分。java i/o流部分(也是IO的主体部分)io辅助类,如File、RandomAccessFile或FileDescriptor,Closeable及Flushable等。io异常类io流分类根据数据...

2018-09-14 12:00:45 332

原创 java I/O体系总结(三) java NIO

java 新IO IO NIO 特点 面向流 面向缓冲 是否阻塞 阻塞IO 非阻塞IO 无 选择器java 新IO主要部分:Buffer(缓冲区)、Channel(通道)、Selectors(选择器)Java NIO的非阻塞模式,如使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数...

2018-09-13 21:23:05 450

原创 java I/O体系总结

java I/O体系总结I/O流的理解先看看流的概念 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。通俗的说,有两个文件A和B,想要把A的内容拷贝到B中,可以假设两文件间有一个通道,把A的数据按字节或是字符的形式传送给B。这个通道就是java...

2018-09-10 16:57:20 579 2

原创 spring初始化接口InitializingBean

spring初始化接口InitializingBeanInitializingBean接口用于初始化bean。此接口只有一个方法afterPropertiesSet, 继承此接口的bean,在bean的属性初始化会执行这个方法。下面看一下此接口定义/** * 当需要在BeanFactory设置完bean的所有属性后,还需做一些初始化的操作,可让该bean实现此接口 */pu...

2018-09-08 10:21:21 2125

原创 使用注解方式构建dubbo服务

使用注解方式构建dubbo服务前言Dubbo是阿里巴巴开源的一个高性能优秀的服务框架,通过使用RPC实现服务调用。在业界尤其国内使用广泛。下面就从头开始构建dubbo的简单demo,配置使用注释方式完成,以zookeeper为注册中心。构建项目以 IntelliJ IDEA 为例,创建一个多模块的项目,项目结构如下图所示。其中,dubbo-demo是父项目,其下有3...

2018-09-07 17:12:58 20537 5

原创 Wait/Notify通知机制解析

Wait/Notify通知机制解析前言我们知道,java的wait/notify的通知机制可以用来实现线程间通信。wait表示线程的等待,调用该方法会导致线程阻塞,直至另一线程调用notify或notifyAll方法才可另其继续执行。经典的生产者、消费者模式即是使用wait/notify机制得以完成。在这篇文章中,我们将深入解析这一机制,了解其背后的原理。

2017-12-09 22:49:04 10415 7

原创 ElasticSearch笔记-5.X版本若干变化

写在前面:去年写的有关Elastic的一些知识是基于2.x版本的,目前最新的版本是5.6(2017-10),一些重要的API与用法已经发生改变。这篇文章在之前系列的基础上,重点从API角度讲讲变化的部分。

2017-10-15 11:36:15 2638

原创 java8的内置函数式接口总结

java8引入了函数式的编程,在提高代码简洁和可读性的同时也 增强了程序并发执行的能力。这篇文章我们主要关注java8的函数式接口,以及其内置的若干函数式接口。

2017-10-02 10:56:57 3487

原创 快速排序(QuickSort)算法介绍

算法简介快速排序(Quicksort)是对冒泡排序的一种改进算法。由C. A. R. Hoare在1960年提出。该算法使用广泛、效率很高,是最重要的排序算法之一。该算法的实现基本可分为以下几步:

2017-09-20 09:47:38 59993 12

原创 java原生UrlConnection体系梳理

HTTP 协议是目前 Internet 上使用得最多、最重要的协议。该协议为典型的请求-响应模型。客户端建立连接并发送请求,服务端接受并处理请求,再发送应答,再由客户端接受并处理应答。浏览器是最常见的一种客户端,它将用户的交互行为作为http请求发送,并接受服务端的应答,再将应答内容展示,一般应答都是html类型的超文本。

2017-09-18 09:21:57 1583

原创 多级选择组件解决实践

问题描述这里的多级选择组件问题,指的是存在一个多级的选择组件,当点击某个节点时,该节点及其下的所有节点都要选中,若该节点并列的所有兄弟节点都已选中,则其父节点也要勾选,依此到最顶端节点。反选也类似逻辑。这个问题也符合平日的认知习惯。

2017-09-14 18:55:39 1510 2

原创 ReentrantLock原理探究(二)

前言上篇ReentrantLock原理探究(一)介绍了ReentrantLock类的使用说明,详细解析了关于非公平锁的lock()过程。这篇我们继续分析。

2017-05-24 12:42:10 733

原创 java代理模式与JDK代理解析

前言代理模式是很常用的设计模式之一,一般可分为静态代理和动态代理两类。java利用反射也对动态代理提供了支持。今天我们就来学习学习。1. 定义 给某一个对象提供一个代理,并由代理对象控制对原对象的引用,称为代理模式。它是一种对象结构型模式。即可理解为,某个对象实例(记为Subject)不方便直接引用,我们就提供一个代理实例(记为Proxy),让这个代理实例去调用实例对象。

2017-05-24 12:39:08 519

原创 java获取方法参数名的若干实践

文章首发于我的个人博客网站梧桐和风的博客,欢迎关注。前言我们知道java可以通过反射得到方法名、参数类型等信息。但我们似乎不能直接得到方法的参数名。而在一些场景中,比如构建自己的MVC框架时,我们也想像Spring MVC一样,根据参数名获取用户传来的数据。下面就来总结一下,都有哪些方法可以获得方法的参数名。

2017-05-15 13:40:23 12815 4

原创 java多线程之线程通信

在多线程机制中,线程之间需要传输信息。一般有以下几种通信机制:共享对象:通过在共享对象中设置信号量,多个线程通过读取、修改该信号量来通信。wait/notify()方法:线程之间通过调用wait()、notify()方法实现线程等待、唤醒状态,从而达到线程通信的目的。接下来我们分别看看这两种方法:通过共享对象通信在共享对象中设置信号量是最简单也是最常用的线程通信方法。共享变量需要使用volat

2017-05-11 13:23:35 553

Putty远程登录工具

远程登录工具最出名的软件之一,体积小,免安装

2015-06-28

java 8 API英文版

Java 8 API,学习java的必备自来哦

2015-06-28

空空如也

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

TA关注的人

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