springbean 三级缓存
摘要:Spring核心之bean生命周期和三级缓存 目录 1 Spring核心 1.1 bean生命周期 1.1.1 bean生命周期中重要接口 1.1.2 创建bean 1.1.3 属性填充 1.1.4 初始化bean 1.1.4.1 Aware相关接口 1.1.4.2 BeanPostProcesso
阅读全文
Feign源码解析
摘要:抄录于 https://www.cnblogs.com/sky-chen/archive/2019/04/16/10718759.html 1. Feign源码解析 1.1. 启动过程 1.1.1. 流程图 1.1.2. 解释说明 Feign解析过程依赖Spring的初始化,它通过实现ImportB
阅读全文
JAVA指针压缩的实现原理
摘要:前言在网上大家很多都看到过这样一句话:“JVM内存最好不要超过32G”。今天我们就来分析一下为什么?32G到底是怎么算出来的。 JAVA对象模型我们先了解一下,一个JAVA对象的存储结构。在Hotspot虚拟机中,对象在内存中的存储布局分为 3 块区域:对象头(Header)、实例数据(Instan
阅读全文
Jvm对象结构和指针压缩
摘要:抄录于 https://www.cnblogs.com/jssj/p/14348271.html 《Java 底层原理》Jvm对象结构和指针压缩 阅读目录 前言 对象内存结构 计算对象大小 指针压缩 总结 回到目录 前言 Java 程序调优是一个程序员必备的技能。 回到目录 对象内存结构 对象头:
阅读全文
JVM内存结构
摘要:抄录于 https://www.cnblogs.com/qianguyihao/p/4748392.html 主要内容如下: JVM启动流程 JVM基本结构 内存模型 编译和解释运行的概念 一、JVM启动流程: JVM启动时,是由java命令/javaw命令来启动的。 二、JVM基本结构: JVM基
阅读全文
Java内存模型 JMM
摘要:抄录于 https://www.cnblogs.com/null-qige/p/9481900.html java内存模型JMM理解整理 什么是JMM JMM即为JAVA 内存模型(java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问逻辑有一定的差异,结果就是当
阅读全文
BlockingQueue 阻塞队列
摘要:抄录于 https://www.cnblogs.com/xieyanke/p/13441318.html BlockingQueue原理 概念 BlockingQueue 翻译成中文阻塞队列,顾名思义就是线程使用队列时会阻塞当前线程; BlockingQueue 继承了Collection,具有一般
阅读全文
newScheduledThreadPool 创建一个可定期或者延时执行任务的定长线程池,支持定时及周期性任务执行。
摘要:定时任务示例代码: 先提交的任务500ms再执行,后提交的任务100ms后执行,打印结果是后提交的任务先执行,本文主要分析定时线程池内部实现,这里面定时操作是怎么实现的,怎么保证顺序的 ScheduledThreadPoolExecutor executor = (ScheduledThreadPo
阅读全文
线程池回收
摘要:我们都知道在向线程池提交任务时,会有以下三种情况:如果线程池内运行的线程数小于设置的 corePoolSize 值,不论是否有空闲线程都会新创建一个线程执行该任务1. 如果线程数已到达 corePoolSize 值,则会将任务放入任务队列2. 当任务队列已满,并且线程数小于设置的 maximumPo
阅读全文
Executor线程池
摘要:抄录于 https://www.cnblogs.com/superfj/p/7544971.html 由浅入深理解Java线程池及线程池的如何使用 前言 多线程的异步执行方式,虽然能够最大限度发挥多核计算机的计算能力,但是如果不加控制,反而会对系统造成负担。线程本身也要占用内存空间,大量的线程会占用
阅读全文
ReentrantReadWriteLock
摘要:抄录于 https://www.cnblogs.com/xiaoxi/p/9140541.html 一、读写锁简介 现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如果一个线
阅读全文
Semaphore信号量
摘要:Semaphore https://www.cnblogs.com/caoleicoding/p/15015067.html 示例代码 Semaphore也是jdk1.5引入的组件,它的字面意思是信号量,但是单从字面翻译我们是无法得知它的作用的,根据官方注释以及网上的一些解释,semaphore简单
阅读全文
CyclicBarrier回环栅栏
摘要:CyclicBarrier回环栅栏字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。一个同步辅助
阅读全文
CountDownLatch
摘要:CountDownLatch的理解和使用 在笔者想要了解Thrift时候,找到一个博主写的系统间通信技术的架构设计,在了解和学习的过程中遇到很多小问题和基础知识,自己还是不够清楚,就查询和总结下。 因为笔者也都是从网上找的一些资料,好的资料笔者都是自己收敲一遍,这样觉得能够加深下印象,引发更多的思考
阅读全文
ConcurrentHashMap
摘要:转自:https://www.jianshu.com/p/78989cd553b4 一、Segment HashMap 在高并发下会出现链表环,从而导致程序出现死循环。高并发下避免 HashMap 出问题的方法有两种,一是使用 HashTable,二是使用 Collections.syncroniz
阅读全文
hash哈希
摘要:1、什么是哈希表?哈希表(HashTable)又叫做散列表,是根据关键码值(即键值对)而直接访问的数据结构。也就是说,它通过把关键码映射到表中一个位置来访问记录,以加快查找速度。看到这里你可能比较疑惑,它是怎么加快查找速度的?下一节就有说明!这个映射函数就叫做散列(哈希)函数,存放记录的数组叫做散列
阅读全文
synchronizedMap
摘要:Doug Lea的 util.concurrent包除了包含许多其他有用的并发构造块之外,还包含了一些主要集合类型 List和 Map的高性能的、线程安全的实现。Brian Goetz向您展示了用 ConcurrentHashMap替换 Hashtable或 synchronizedMap,将有多少
阅读全文
HashMap扩容时对链表和红黑树变化
摘要:我们知道 HashMap 的底层是由数组,链表,红黑树组成的,在 HashMap 做扩容操作时,除了把数组容量扩大为原来的两倍外,还会对所有元素重新计算 hash 值,因为长度扩大以后,hash值也随之改变。 如果是简单的 Node 对象,只需要重新计算下标放进去就可以了,如果是链表和红黑树,那么操
阅读全文
HashMap扩容
摘要:HashMap简介 HashMap在底层数据结构上采用了数组+链表+红黑树,通过散列映射来存储键值对数据因为在查询上使用散列码(通过键生成一个数字作为数组下标,这个数字就是hash code)所以在查询上的访问速度比较快,HashMap最多允许一对键值对的Key为Null,允许多对键值对的value
阅读全文
HashMap实现原理及源码分析
摘要:哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出现在各类的面试题中,重要性可见一斑。本文会对java集合框架中的对应实现HashMap的实现原理进行
阅读全文
AQS
摘要:Java并发之AQS详解 一、概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常
阅读全文
CopyOnWriteArraySet
摘要:转载:http://www.cnblogs.com/skywang12345/p/3498497.html 概要 本章是JUC系列中的CopyOnWriteArraySet篇。接下来,会先对CopyOnWriteArraySet进行基本介绍,然后再说明它的原理,接着通过代码去分析,最后通过示例更进一
阅读全文
synchronizedSet
摘要:一般而言,想要构造出线程安全的 Set,我们会使用 Collections.synchronizedSet 方法,如下所示。 Set<User> set = Collections.synchronizedSet(new HashSet<>());1但这并不意味着,你可以安全的使用该集合的任何方法,
阅读全文
COW
摘要:为什会有 Copy On Write COW 在不同的操作系统,或者框架中都会有相应的实现 优点 COW 技术可以减少分配和赋值大量资源带来的瞬时延迟 COW 可以减少不必要的资源分配。比如 fork 进程时,并不是所有的页面都需要赋值。父进程的代码段和只读数据段都不被允许修改,所以无需复制 缺点
阅读全文
CopyOnWriteArrayList
摘要:CopyOnWriteArrayList实现原理及源码分析 CopyOnWriteArrayList是Java并发包中提供的一个并发容器,它是个线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现,是一种读写分离的并发策略,我们也可以称这种容器为"写时复制器",Java并
阅读全文
synchronizedList
摘要:摘要: 详细的解析:Collections.synchronizedList 1 :关注要点,为什么在有synchroniezed方法的同时会出现 Collections.synchronizedList 2 :知识背景: 您可能需要了解java Synchronized方法的加锁的各种机制,包括如
阅读全文
Stack
摘要:在Java中Stack类表示后进先出(LIFO)的对象堆栈。栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的。每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下: Stack通过五个操作对Vector进行扩展,允许将向量视为堆栈。这个五个操作如下: 操作 说明 empty()
阅读全文
Vector
摘要:Vector可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。不过,Vector的大小是可以增加或者减小的,以便适应创建Vector后进行添加或者删除操作。 Vector实现List接口,继承AbstractList类,所以我们可以将其看做队列,支持相关的添加、删除、修改、
阅读全文
synchronized和volatile的区别
摘要:synchronized和volatile的区别: 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是 立即可见的。 2)禁止进行指令重排序。 vo
阅读全文
Volatile
摘要:Volatile可以看做是轻量级的 Synchronized,它只保证了共享变量的可见性。在线程 A 修改被 volatile 修饰的共享变量之后,线程 B 能够读取到正确的值。java 在多线程中操作共享变量的过程中,会存在指令重排序与共享变量工作内存缓存的问题。 java 内存模型 Java内存
阅读全文
CAS
摘要:一、什么叫CAS? CAS,是 compare and swap 的缩写,即比较并交换。它是一种基于乐观锁的操作。它有三个操作数,内存值V,预期值A,更新值B。当且仅当A和V相同时,才会把V修改成B,否则什么都不做。之前说到AtomicInteger用到了CAS,那么先从这个类说起。看如下代码: p
阅读全文
synchronized 锁升级状态
摘要:在Java高并发系统中,我们常常需要使用多线程技术来提高系统的运行速度,而多线程带来的数据安全问题就是我们必须要解决的问题。在Java中,可以使用synchronized关键字来实现多线程并发中的数据安全问题。 这里简单介绍下synchronized的三种用法: 修饰实例方法:以实例对象作为锁,进入
阅读全文
synchronized和lock区别
摘要:在分布式开发中,锁是线程控制的重要途径。Java为此也提供了2种锁机制,synchronized和lock。做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方。 我们先从最简单的入手,逐步分析这2种的区别。 一、synchronized和lock的用法区别 sy
阅读全文
Lock
摘要:从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。 也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从synchronized的缺陷讲起
阅读全文
synchronized
摘要:锁的内存语义 synchronized的底层是使用操作系统的mutex lock实现的。 内存可见性:同步快的可见性是由“如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值”、“对一个变量执行unlock操作之前
阅读全文
Java线程的状态
摘要:在Java程序中,一个线程对象只能调用一次start()方法启动新线程,并在新线程中执行run()方法。一旦run()方法执行完毕,线程就结束了。因此,Java线程的状态有以下几种: New:新创建的线程,尚未执行; Runnable:运行中的线程,正在执行run()方法的Java代码; Block
阅读全文
Java线程常用方法详解
摘要:Java线程常用方法详解 线程的常用方法 1.start() : 线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。 2.run(): Thread类的run()方法与Runnable接口中的run()方法的功能和
阅读全文
创建线程
摘要:java中创建线程的三种方法以及区别Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用四种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线程 3)使用Callable和Future创建线程 下面让我们分
阅读全文
java中的ClassLoader详解
摘要:【转】一看你就懂,超详细java中的ClassLoader详解 http://blog.csdn.net/briblue/article/details/54973413 ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见。 理解Cla
阅读全文
为什么Kafka速度那么快
摘要:Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间,但是实际上,Kafka的特性之一就是高吞吐率。 即使是普通的服务器,Kafka也可以轻松支持每秒百万级的写入请求,超过了大部分的消息中间件,这种特性也使得Kafka在日志处理等海量数据场景广泛应用
阅读全文
kafka 0拷贝
摘要:kafka中的消费者在读取服务端的数据时,需要将服务端的磁盘文件通过网络发送到消费者进程,网络发送需要经过几种网络节点。如下图所示: image.png 传统的读取文件数据并发送到网络的步骤如下: (1)操作系统将数据从磁盘文件中读取到内核空间的页面缓存; (2)应用程序将数据从内核空间读入用户空间
阅读全文
redis 多路复用
摘要:这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。 redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。
阅读全文
mysql
摘要:优化 https://www.bilibili.com/video/BV1QF411Y7GY?p=57
阅读全文
编码
摘要:mysql存中文 utf-8 mb4 https://www.cnblogs.com/amou/p/9063479.html
阅读全文
jvm 内存模型
摘要:https://www.bilibili.com/video/BV1Xi4y1Z7v4?p=2
阅读全文
synchionzed
摘要:https://www.cnblogs.com/aspirant/p/11470858.html
阅读全文
springboot
摘要:面试题 https://www.bilibili.com/video/BV1ag411F7PP?p=18 代码 http://www.ityouknow.com/spring-boot.html 参考1 参考2 参考3 参考4
阅读全文