自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 arraycopy()的简单使用

源码:public static native void arraycopy(Object src, int srcPos, Object dest, int destPos,int length);参数: src:要复制的数组(源数组) srcPos:复制源数组的起始位置 dest:目标数组 destPos:目标数组的下标位置 leng...

2019-04-17 20:23:58 51372 2

原创 分布式相关思维导图

个人对分布式方面的一些笔记、包括CAP、Base理论、分布式锁、分布式事务、分布式缓存等。如有问题欢迎大家指正。

2020-07-23 21:52:33 496 1

原创 JVM思维导图

对学习JVM做个总结,方便以后复习,贴出来也是给大家提供一个资料。参考周志明老师的《深入理解Java虚拟机》,有什么描述不对的地方还请指出,不胜感激。

2020-06-15 22:18:55 215

原创 并发编程思维导图

自己对并发编程这块用思维导图的方式做了个总结,方便以后回顾,目前涵盖的可能还不全,后续更新吧。其中的内容也是资料结合个人理解,有什么不对的地方还请指出,共同进步。其中有些地方有做的一些笔记,导图上面没有体现出来,有需要的话私信留言都行。...

2020-06-12 22:20:59 504

原创 死磕并发之先行发生原则(happens-before)

程序次序原则:在一个线程内,按照程序代码顺序,书写在前面的操作先行发生于书写后面的操作。准确的说,应该是控制流顺序而不是程序代码顺序,因为要考虑分支、循环等结构。程序锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作。这里必须强调的是同一个“锁”,而“后面”是指时间上的先后顺序。volatile变量规则:对一个volatile变量的写操作先行发生于后面对这个变量的读操作,这...

2020-05-04 23:37:24 182

原创 死磕并发之volatile关键字详解

volatile关键字可以说是java虚拟机提供的最轻量级的同步机制。当一个变量定义为volatile之后,它将具备两种特性:保证此变量对所有线程的可见性。“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。普通变量和volatile关键字修饰的变量都是依赖主内存作为传递媒介的方式实现可见性的。唯一的区别就是: volatile修饰的变量保证每次修改后...

2020-05-04 23:35:01 180

原创 死磕并发之java内存模型(JMM)

了解虚拟机的并发问题之前我们首先先了解下物理机对并发的处理方案由于计算机的存储设备与处理器的运算速度有几个数量级的差距(也就是内存和cpu的差距),所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存中,这样处理器就无须等待缓慢的内存读写了。处...

2020-05-04 23:29:54 136

原创 死磕并发之线程池核心参数

为什么要用线程池呢?虽然创建线程看起来很简单,只需要new Thread()就可以了,但实际上创建线程远不止创建一个对象这么简单。创建对象,仅仅是在堆内存中分配一块内存而已,而创建线程则需要调用操作系统内核API,然后操作系统要为线程分配一系列的资源,这个成本比创建一个对象时要高很多的。所以线程是一个重量级的对象,应避免频繁创建和销毁。线程池几个核心参数corePoolSiz...

2020-04-24 22:03:22 211

原创 死磕并发之ReadWriteLock读写锁的使用

所有读写锁都要遵循以下三条基本原则:允许多个线程同时读共享变量。只允许一个线程写共享变量。如果一个线程正在执行写操作,此时禁止读线程读共享变量。总结: 读-读可以,读-写互斥,写-写互斥。注意:写锁可降级为读锁,读锁不能升级为写锁。简单使用示例public class ReentranReadWriteLokeDemo<K, V> { priva...

2020-04-22 22:45:58 437

原创 死磕并发之Semaphore的使用

Semaphore的模型可以简单的概括为:一个计数器,一个等待队列,三个方法。在信号量模型里,计数器和等待队列对外是透明的,所以只能通过信号量模型提供的三个方法来访问它们,这三个方法分别是:init()、down()、up()init():设置计数器初始值。down():计数器的值减 1;如果此时计数器的值小于 0,则当前线程将被阻塞,否则当前线程可以继续执行。up():计数器...

2020-04-22 22:22:33 136

原创 死磕并发之CyclicBarrier的使用

CyclicBarrier和CountDownLatch的不同是CyclicBarrier的计数器有自动重置的功能CyclicBarrier有提供回调函数的功能,当计数器减到0时,会调用这个回调函数。简单使用例子:public class CyclicBarrierDemo { static CyclicBarrier cyclicBarrier = new ...

2020-04-22 22:20:26 320

原创 死磕并发之CountDownLatch的使用

CountDownLatch和join的作用类似。joinThread.join()方法使线程等待,待线程退出时,调用Thread.join()的主线程会被唤醒,从而执行后续操作。当处于线程池的状态下,线程不会退出,join就会一直执行不到。如下示例,会先输出“执行结束”,然后输出 “Child thread running”public class ThreadJoinD...

2020-04-22 22:18:09 166

原创  死磕并发之到底创建多少个线程合适

为什么要使用多线程?使用多线程的目的就是提升程序性能,在并发编程领域,提升性能本质上就是提升硬件的利用率,再具体点来说,就是提升 I/O 的利用率和 CPU 的利用率。而解决的方案就是多线程。知道了解决方案,问题又来了,创建多少个线程合适呢?多了会造成CPU上下文切换,浪费资源不说性能还上不去,少了吧CPU利用率又上不去。接下来让我们分析下到底创建多少个线程比较合适。创建多少个线程合适...

2020-04-19 16:40:24 772

原创 死磕并发之线程的生命周期详解

文章开始大家思考一个问题,执行了Thread的start方法之后就代表该线程已经开始执行了吗?相信大家看完文章应该就能找到答案。一.线程的生命周期大致分为以下5个阶段1.NEW2.RUNNABEL3.RUNNING4.BLOCKED5.TERMINATED接下来让我们看下这5个阶段分别代表什么。二.线程的NEW状态我们使用new关键字创建一个Thread对象时,...

2020-04-19 15:11:24 135

原创 强引用、软引用、弱引用、虚引用有什么区别?

不同的引用类型,主要体现的是对象不同的可达性(reachable)状态和对垃圾收集的影响。强引用: 强引用类就是指在代码中普遍存在的,类似于Object object = new Object();只要强引用还在,垃圾回收器就永远不会回收被引用的对象,即使发生OOM,如果没有其他引用关系,只要超过了引用的作用于或者显式的将相应引用赋值为null,就可以被垃圾回收器回收掉。软引用...

2020-03-22 18:18:48 1477

原创 Mysql的隔离级别

为什么要有隔离级别?当数据库有多个事务同时执行的时候,就可能出现脏读、不可重复读、幻读的问题,为了解决这些问题,就有了隔离级别脏读:事务a修改了数据,但是a事务还未提交,此时事务b读取到了事务a修改的操作。不可重复读:事务A在事务B提交前读取到的结果和事务B提交后的结果不一致。幻读:select查询a不存在,执行insert操作,发现a已存在,无法插入。mysql的个隔离级别包...

2020-02-22 22:55:50 136

原创 SpringIOC、DI注入原理分析(xml版)

本文章注入是构造函数方式注入!1.加载解析xml。2.查找所有的bean标签、获取到id和class属性。3.通过反射使用class属性配置的类的路径进行初始化对象。4.放入map集合,bean标签下的id属性作为key,初始化后的对象作为value。5.使用反射进行依赖注入。废话不多说,直接上代码,如有什么错误还请指正~一.导入maven依赖,其中有数据库的依赖,可选...

2019-12-08 22:18:26 133

原创 zookeeper的基础知识

1.什么是zookeeper?简介:Zookeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以单机模式...

2019-07-05 21:22:13 237

原创 SpringBoot配置多数据源

1.数据库表结构CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `age` int(20) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=...

2019-06-12 21:46:33 142

转载 Netty面试题总结

文章转自: https://blog.csdn.net/baiye_xing/article/details/767351131.BIO、NIO和AIO的区别?BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理。线程开销大。伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多...

2019-05-28 21:28:01 2248

翻译 jvm参数

参数 默认值 使用介绍 DisableExplicitGC 默认关闭 忽略来自System.gc()方法触发的垃圾收集 ExplicitGCInvokes Concurrent 默认关闭 当收到来自System.gc()方法提交的垃圾收集申请时,使用CMS收集器进行收集 UseSerialGC Client模式的虚拟机默认开启,其他模式关闭 ...

2019-05-22 20:08:57 532

原创 SpringMVC执行流程

1.用户发送请求至DispacherServlet。2.DispacherServlet收到请求调用HandlerMapping处理器映射器。3.处理器映射器根据请求url找到具体的处理器,生出处理器对象及处理器拦截器,一并返回给DsipacherSerlvet4.DispacherServlet通过HandlerAdadapter处理器适配器调用处理器。5.执行处理器(即Co...

2019-05-07 20:44:37 202

原创 Spring随笔

1.什么是AopAop是面向切面编程。2.为什么要使用Aop代码解耦、减少代码冗余、提高代码复用。3.Aop的一些应用场景日志、事务、权限等...4.Aop的核心在方法执行之前或者执行之后处理事情。5.spring的事务机制spring的事务是基于Aop的环绕通知来实现的。6.aop的底层实现机制通过代理设计模式进行实现代理设计模式分为静态代理、jd...

2019-04-29 19:57:00 84

原创 基于jdk1.7的HashMap

1.HashMap参数:DEFAULT_INITIAL_CAPACITY 默认大小为16DEFAULT_LOAD_FACTOR 加载因子,默认为0.752.HashMap扩容机制1.size > (DEFAULT_INITIAL_CAPACITY *DEFAULT_LOAD_FACTOR) = 12,默认情况下,当map容量大于12的情况下进行扩容。每次扩容为当前集合大...

2019-04-25 21:29:24 154

原创 ArrayList、vector、LinkedList的区别你真的知道吗?

ArrayList:1.底层是数组。2.查询遍历快。 根据下标进行取值。3.添加慢。 添加时需要进行扩容,默认数组长度为10,扩容每次扩容1.5倍(扩容计算公式:旧的容量+(旧的容量 >> 1))。 如果知道要添加多少元素,指定集合大小效率会提高。4.删除慢。 根据下标删除时,需要移动后面的所有元素。通过arraycopy(Objec...

2019-04-19 22:21:45 177

原创 java锁机制

1.重入锁1.重入锁又名递归锁。指的是同一线程,外层函数获得锁后,内层递归函数仍然获取该锁。ReentrantLock(显示锁,轻量级锁)和synchronized(内置锁,重量级锁)都是可重入锁。2.悲观锁、乐观锁、排它锁1.悲观锁:悲观锁悲观的认为每一次操作都会造成更新丢失问题,在每次查询时都会加上排它锁。每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,...

2019-04-09 21:09:55 99

原创 并发编程(并发队列)

1.阻塞队列和非阻塞队列的区别?答:阻塞队列:当队列时空的,从队列中获取元素操作将会被阻塞,或者当队列满时,往队列里面添加时将会被阻塞。2.有哪些队列?答:1.ArrayDeque (数组双端队列)2.PriorityQueue (优先级队列)3.ConcurrentLiken...

2019-04-03 20:56:59 148

原创 并发编程面试题(线程池)

1.什么是线程池?答:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。通俗点将,线程池就是一个容器,集中管理线程。线程使用完毕不会销毁,而是会先存储在线程池内。2.线程池的作用?答:1.降低资源消耗。 2.提高响应速度。 3.提高线程的可管理性。3.常见的线程池有哪几种?答:有四种。1.newCac...

2019-04-02 21:19:55 1917

原创 并发编程面试题(基础)

1.进程与线程的区别?答:进程是所有线程的集合,每一个线程是进程的一条执行路径。2.为什么要用多线程?答:提高程序效率3.创建线程的方式?那种方式比较好?答:1.继承Thread类创建线程 2.实现Runnable接口创建线程 3.使用Callable和Future创建线程。有返回值,可以声明抛出异常。实现Runnable的方式比较好,可以继...

2019-04-01 20:56:22 548

原创 垃圾收集算法

一、标记--清除算法标记清除算法分为“标记”、“清除”两个阶段: 标记:首先标记出需要回收的对象。 清除:在标记完成后统一回收所有被标记对象。缺点: 1.效率不足:标记、清除两阶段效率都不高。 2.空间问题:标记清除后会产生大量的空间碎片,空间碎片太多可能会导致程序运行中分配大对象时 无法找到足够的内存空间而提前触...

2019-03-31 21:02:15 101

原创 浅谈JVM:运行时数据区域

运行时数据区域分为:1.程序计数器(Program Counter Register)程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依靠这个计数器来完成。2.虚拟机栈1.线程私有,生命周期与线程相同。虚拟机栈描述的是jav...

2019-01-31 20:46:48 148

空空如也

空空如也

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

TA关注的人

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