自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JUC并发工具的使用和原理

ConditionCondition原理Condition 是一个多线程协调通信的工具类,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒。在AQS中存在两个FIFO队列:同步队列 和 等待队列。本篇文章主要是讲condition实现原理(即等待队里),同步队列实现原理看这篇文章:深入剖析AQS。等待队列是由Condition内部实现的,是一个虚拟的FI...

2020-11-24 13:56:00 350

原创 线程启动与终止原理

线程启动原理 当用start()开始一个线程后,线程就进入就绪状态,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行;但是这并不意味着线程就会立即运行,只有当cpu分配时间片时,这个线程获得时间片时,才开始执行run()方法;start()方法去调用run(),而run()方法则是需要去重写的,其包含的是线程的主体(真正的逻辑)。在我最早学习线程的时候会比较疑惑,启动一...

2020-11-19 17:03:00 311

原创 cpu缓存一致性

CPU Cache 的数据写入随着时间的推移,CPU 和内存的访问性能相差越来越大,于是就在 CPU 内部嵌入了 CPU Cache(高速缓存),CPU Cache 离 CPU 核心相当近,因此它的访问速度是很快的,于是它充当了 CPU 与内存之间的缓存角色。CPU Cache 通常分为三级缓存:L1 Cache、L2 Cache、L3 Cache,级别越低的离 CPU 核心越近,访问速度也...

2020-11-10 22:42:00 152

原创 布隆过滤器

1.什么是布隆过滤器?首先,我们需要了解布隆过滤器的概念。布隆过滤器(Bloom Filter)是一个叫做 Bloom 的老哥于1970年提出的。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的的 List、Map 、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情...

2020-11-09 16:45:00 73

原创 对象并不一定都是在堆上分配内存(逃逸分析)

一、JVM内存分配策略关于JVM的内存结构及内存分配方式,不是本文的重点,这里只做简单回顾。以下是我们知道的一些常识:1、根据Java虚拟机规范,Java虚拟机所管理的内存包括方法区、虚拟机栈、本地方法栈、堆、程序计数器等。2、我们通常认为JVM中运行时数据存储包括堆和栈。这里所提到的栈其实指的是虚拟机栈,或者说是虚拟栈中的局部变量表。3、栈中存放一些基本类型的变量数据(int/shor...

2020-11-03 15:59:00 151

原创 深入剖析AQS

1. 锁原理 - 信号量 vs 管程在并发编程领域,有两大核心问题:互斥与同步,互斥即同一时刻只允许一个线程访问共享资源,同步,即线程之间如何通信、协作,一般这两大问题可以通过信号量和管程来解决。信号量信号量(Semaphore)是操作系统提供的一种进程间常见的通信方式,主要用来协调并发程序对共享资源的访问,操作系统可以保证对信号量操作的原子性。它是怎么实现的呢。信号量由一个共享整型...

2020-11-03 13:35:00 215

原创 手写简易线程池

/**手写简易的线程池 * @author 胡庆安 * @version V1.0 * @Package Thread.pool * @date 2020/10/23 10:57 * @Copyright © 2010-2020 爬山虎科技(扬州)股份有限公司 */public class HqaPool { /** * 核心线程数 */ i...

2020-10-28 15:02:00 63

原创 手写一个简易的ReentrantLock

public class HqaLock { private static final Unsafe unsafe = reflectGetUnsafe(); private static final long ownerOffset; /** * 锁是否被持有(1)是,(0)否 */ AtomicInteger state = new A...

2020-10-22 18:23:00 114

原创 深入理解Java虚拟机读书笔记--自动内存管理

1. 运行时数据区1.1 程序计数器 程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的 字节码的行号指示器。在Java虚拟机的概念模型里[1],字节码解释器工作时就是通过改变这个计数器 的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处 理、线程恢复等基础功能都需要依赖这个计数器来完成。 ...

2020-10-21 11:26:00 109

原创 罗列一下spring事务的一些坑

一、spring事务的原理? 首先,我们先明白spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。 那么,我们一般使用JDBC操作事务的时候,代码如下(1)获取连接 Connection con = DriverManager.getConnection()(2)开启事务con.setAutoCommit(true/false)...

2020-10-12 13:35:00 94

原创 锁升级简记

锁升级简记 从JVM规范中可以看到Synchonized在JVM里的实现原理,JVM基于进入和退出Monitor对 象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter 和monitorexit指令实现的,而方法同步是使用另外一种方式实现的,细节在JVM规范里并没有 详细说明。但是,方法的同步同样可以使用这两个指令来实现。 monitorenter...

2020-10-10 14:22:00 68

原创 调度算法(待完善)

一 . 进程调度算法进程调度算法也称 CPU 调度算法,毕竟进程是由 CPU 调度的。当 CPU 空闲时,操作系统就选择内存中的某个「就绪状态」的进程,并给其分配 CPU。什么时候会发生 CPU 调度呢?通常有以下情况:当进程从运行状态转到等待状态;当进程从运行状态转到就绪状态;当进程从等待状态转到就绪状态;当进程从运行状态转到终止状态;其中发生在 1 和 ...

2020-09-17 17:33:00 94

原创 注解方式实现接口幂等性

一、概念幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次 比如:订单接口, 不能多次创建订单支付接口, 重复支付同一笔订单只能扣一次钱支付宝回调接口, 可能会多次回调, 必须处理重复回调普通表单提交接口, 因为网络超时等原因多次点击提交, 只能成功一次 等等二、常见解决方案唯一索引 -- 防止新增脏数据token机制 -...

2020-08-28 12:53:00 249

原创 强软弱虚

Java中的四种引用Java中有四种引用类型:强引用、软引用、弱引用、虚引用。Java为什么要设计这四种引用Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,说的专业点,叫可达性分析。Java设计这四种引用的主要目的有两个:可以让程序员通过代码的方式来决定某个对象的生命周期;有利用垃圾回收。强...

2020-08-28 09:56:00 55

原创 策略设计模式

现实生活中我们到商场买东西的时候,卖场往往根据不同的客户制定不同的报价策略,比如针对新客户不打折扣,针对老客户打9折,针对VIP客户打8折...现在我们要做一个报价管理的模块,简要点就是要针对不同的客户,提供不同的折扣报价。如果是有你来做,你会怎么做?我们很有可能写出下面的代码:public class QuoteManager { public BigDecimal quo...

2020-08-28 09:10:00 283

原创 线程池详解

一 、使用线程池的好处池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。线程池提供了一种限制和管理资源(包括执行一个任务)。 每个线程池还维护一些基本统计信息,例如已完成任务的数量。这里借用《Java 并发编程的艺术》提到的来说一下使用线程池的好处:降低资源消耗。通过重复...

2020-08-20 14:50:00 58

原创 浅析JVM

一 .Java运行时数据区: Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图:1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。2、虚拟机栈:虚拟机栈是Jav...

2020-06-11 16:32:00 101

原创 分布式事务

一 .事务的概念什么是分布式系统 部署在不同结点上的系统通过网络交互来完成协同工作的系统比如:充值加积分的业务,用户在充值系统向自己的账户充钱,在积分系统中自己积分相应的增加。充值系统和积分系统是两个不同的系统,一次充值加积分的业务就需要这两个系统协同工作来完成。什么是事务 事务是指由一组操作组成的一个工作单元,这个工作单元具有原子性(atomicity)、一致性(consistency...

2020-06-07 00:19:00 65

原创 分布式锁

一 . 为什么要用分布式锁我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的Java多线程的18般武艺进行处理,并且可以完美的运行,毫无Bug!注意这是单机应用,也就是所有的请求都会分配到当前服务器的JVM内部,然后映射为操作系统的线程进行处理!而这个共享变量只是在这个JVM内部的一块内存空间!后来业务发展,需要做集群,一个应用需要部署到几台机器上然...

2020-06-06 16:41:00 88

原创 深入MySQL索引

一、索引介绍1.1 索引是什么官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。我们通常所说的索引,包括聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,...

2020-06-05 13:54:00 285

原创 深入理解MyBatis——缓存

MyBatis中使用缓存来提高其性能。MyBatis中的缓存分为两种:一级缓存和二级缓存。使用过MyBatis的可能听到过这样一句话“一级缓存是sqlSession级别的,二级缓存是mapper级别的”。这也说明了,当使用同一个sqlSession时,查询到的数据可能是一级缓存;而当使用同一个mapper是,查询到的数据可能是二级缓存。MyBatis中的一级缓存执行查询时,SqlSessi...

2020-05-22 22:28:00 123

原创 公平锁与非公平锁

公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。优点:所有的线程都能得到资源,不会饿死在队列中。 缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。 非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。优点:可以减少CPU唤醒线程的开...

2020-05-20 21:44:00 73

原创 sql优化

1.查询SQL尽量不要使用select *,而是select具体字段。反例:select * from employee;正例:select,id,name from employee;理由:只取需要的字段,节省资源、减少网络开销。select * 进行查询时,很可能就不会使用到覆盖索引了,就会造成回表查询。2.如果知道查询结果只有一条或者只要最大/最小一条记...

2020-05-18 21:18:00 65

原创 深入研究HashMap

一. HashMap的结构和底层原理 HashMap是我们非常常用的数据结构,由数组和链表组合构成的数据结构。大概如下,数组里面每个地方都存了Key-Value这样的实例,在Java7叫Entry在Java8中叫Node。 因为他本身所有的位置都为null,在put插入的时候会根据key的hash去计算一个index值。就比如我put(”帅丙“,520),我插入了为”帅丙“的元素,这个时...

2020-05-17 16:44:00 43

原创 Redis学习笔记

一 . Redis 是什么Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key - value 数据库Redis 与 其他 key - value 缓存产品有以下三个特点:Redis 支持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis 不仅仅支持简单的 key - value 类型的数据,同时还提供 list,set,z...

2020-03-18 13:33:00 78

原创 线程与并发(四) 线程协作的两种方式

有的时候我们需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态。然后...

2020-01-20 14:57:00 57

原创 线程与并发(三) 阻塞队列

  在我们使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦。但是有了阻塞队列就不一样了,它会对当前线程产生阻塞,比如一个线程从一个空的阻塞队列中取元素,此时线程会被阻塞直到阻塞队列中有了元素。当队列中有元素后,被阻塞的线程会自动被唤醒(不需要我们编写代码去唤醒)。这样提供了极...

2020-01-19 14:39:00 99

原创 在浏览器输入 URL 回车之后发生了什么?

大致流程一、URL 解析地址解析: 首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。HSTS 由于安全隐患,会使用 HSTS 强制客户端使用 HTTPS 访问页面。其他操作 浏览器还会进行一些额外的操作,比如安全检查、访问限制(之前国产浏览器限制 996.icu)。检查缓存二、DNS 查询基本步骤1. 浏...

2020-01-08 12:53:00 74

原创 线程与并发(二) 深入volatile关键字

一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因...

2019-12-30 15:29:00 61

原创 线程与并发(一) 多线程基础

一 .任务,进程与线程多任务: 指用户在同一时间内运行多个应用程序,每个应用程序可以认为是一个任务.常见的操作系统Linux、windows等就是支持多任务的操作系统。 进程: 计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,通俗讲就是对操作系统中运行的应用程序及其运行环境的统称。比如window上运行QQ程序,还需占用一定内存 线程: 指应用程序中一个...

2019-12-25 13:24:00 69

原创 SpringCloud入门

一 .微服务架构介绍1.单体架构是什么 单体架构也称之为单体系统或者是单体应用。就是一种把系统中所有的功能、模块耦合在一个应用中的架构方式。2 单体架构特点 2.1 打包成一个独立的单元(导成一个唯一的 jar 包或者是 war 包) 2.2 会一个进程的方式来运行3 单体架构优缺点 3.1 优点 项目易于管理,部署简单。 3.2 缺点 测试成本高,可伸缩性强,可靠性差,迭代...

2019-12-16 15:36:00 97

原创 MySQL事务与MVVC

一、ACID特性数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。(执行单个逻辑功能的一组指令或操作称为事务)1. 原子性原子性是...

2019-11-21 15:14:00 88

原创 dubbo入门

一 .SOA1.英文名称(Service Oriented Ambiguity)2.中文名称:面向服务架构 2.1 有一个专门提供服务单元. 2.2 其他所有单元都调用这个服务. 3.SOA 定位: 3.1 如何设计项目,让开发时更有效率. 3.2 SOA 是一种4.之前项目架构 4.1 在公司项目不允许所有项目都访问数据库. 4.2 开发时,数据库访问层代码可能出现...

2019-11-19 16:10:00 65

原创 代码优化

代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可...

2019-11-07 21:34:00 82

原创 springmvc入门使用

1.配置文件1.1配置核心控制器-一个 Servlet<!-- 前端控制器(加载classpath:springmvc.xml 服务器启动创建servlet) --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet...

2019-10-30 09:43:00 30

空空如也

空空如也

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

TA关注的人

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