自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 区间问题

区间合并一个区间可以表示为[start,end],按start排序 List<List<Integer>> list = List.of(List.of(4, 5), List.of(1, 4)); list = list.stream() .sorted(Comparator.comparingInt(s -> s.get(0))) .collect(Collectors.toList()); Lis

2020-05-13 09:42:39 169

原创 树-图-递归

消消乐,填色游戏,DFSint[][] floodFill(int[][] image, int sr, int sc, int newColor) { int origColor = image[sr][sc]; fill(image, sr, sc, origColor, newColor); return image;}void fill(int[][] image, int x, int y, int origColor, int

2020-05-13 09:42:17 177

原创 双指针

去除有序数组中的重复元素,快慢指针int removeDuplicates(int[] nums){ int n = nums.length; if(n == 0) return 0; int slow = 0; int fast = 1; while(fast < n){ if(nums[fast]==nums[slow]]{ slow++; nums[slow] = num[fast];

2020-05-12 02:40:49 121

原创 回文串和回文序列,回文链表相关问题

最长回文串,左右指针中心扩展String longestStr(String s){ char[] chars = new char[s.length()]; String str = null; for(int i=0;i<s.length(),i++){ chars[i] = s.charAt[i]; } for(int i = 1;i<chars.length;i++){ str1=pilidrome(s,i,

2020-05-12 02:40:37 131

原创 水塘抽样算法

给一个未知长度的序列,如何在其中随机地选择k个元素?第i个元素被选择的概率是1/i,第i+1次不被替换的概率是1 - 1/(i+1),以此类推,相乘就是第i个元素最终被选中的概率,就是1/n。/* 返回链表中一个随机节点的值 */int getRandom(ListNode head) { Random r = new Random(); int i = 0, res = 0; ListNode p = head; // while 循环遍历...

2020-05-12 02:40:24 143

原创 union-Find

class UF{ int count; int[] parent; int[] size; public UF(int n){ this.count = n; parent = size = new int[n]; for(int i=0; i<n; i++){ parent[i] = i; size[i] = 1; } } publi.

2020-05-12 02:40:13 89

原创 二分查找判断子序列

寻找左侧边界int left_bound(int[] nums, int target){ int left = 0; int right = nums.length; while(left < right){ int mid = left + (right-left) / 2; if(nums[mid] = target){ right = mid; }else if(nums[mid] &lt

2020-05-12 02:39:58 159

原创 栈——判断括号合法性

boolean isValid(String str){ Stack stack = new Stack(); char[] strChar = new char[str.length()]; for (int i = 0; i < strChar.length; i++) { char c = str.charAt(i); if (c == '(' || c == '{' || c == '[') stack.push(c); else.

2020-05-12 02:39:45 255

原创 Mysql(一)

MySql InnoDB引擎事务死锁时指两个事务在同一资源上相互占用,并请求锁定对方占用的资源。当多个事务试图以不同的顺序锁定资源时,就可能产生死锁,多个事务同时锁定同一个资源时,也会产生死锁。InnoDB目前处理死锁的方法是将持有最少行级排他锁的事务进行回滚。死锁发生以后只有部分或者完全回滚其中一个事务,才能打破死锁mysql默认采用自动提交模式,也就是如不显示地开始一个事务,则每个...

2019-07-07 21:23:59 89

原创 走近Tomcat(二)

Catalinacatalina使用digester解析XML配置文件并创建应用服务器,生成对应的容器类并启动Web请求处理总体过程Tomcat通过Mapper维护了链接与Host、Context、Wrapper等Container的映射,同时通过MapperListener监听所有的Host、Context、Wrapper组件,在相关组件启动、停止时注册或者移除相关映射,此外通...

2019-07-06 16:40:31 111

原创 走近Tomcat(一)

本文主要以Tomcat8.0进行一个原理的讲解8.0新特性:Tomcat支持Servlet3.1,JSP2.3EL3.0。9.0版本开始支持Servlet4.0,HTTP,AJP采用NIO。8.5开始移除了BIO支持,开始支持HTTP2,默认采用异步日志处理tomcat整体架构:一个server对应多个service(多个connector和一个engine),一个engine对应多...

2019-07-06 10:18:43 175

原创 消息队列——kafka

topic:文件上传,短信,截图,流程图,流程文件,索引文件到es。3个broken,5个partition,3个副本引入mq的缺陷:1.可用性降低,复杂性2.消息重复消费:幂等性,redis天然幂等性,生成唯一id,先去redis里面查,没有就消费,kafka 设置enable.idempotence为True,生成PID,PID大于值的才被接收3.消息遗失:producer ...

2019-07-04 00:01:25 240

原创 分库分表及分布式搭建

sharding-jdbc jar包、mycat分库分表如何不停机分库分表双写迁移方案,修改写库的代码,同时写老库和分库分表的库,如果分库分表不存在直接写入,如果存在比较时间戳,躲开几台机器循环check数据是不是相当,到凌晨几乎没有数据进来,此时老库和新库数据一样了,切换到分库分表的新库分库分表的id问题雪花算法采用64位:首位位0,时间戳用41位保存,机房id5位,机器id...

2019-05-25 14:08:50 260

原创 zookeeper以及分布式事物一致性杂记

zookeeper分布式协调这个其实是zk很经典的一个用法,简单来说,好比你A系统发送个请求到mq,然后B系统消费。那么A系统如何知道B系统的处理结果?用zk就可以实现分布式系统之间的协调工作。A系统发送请求之后可以在zk上对某个节点的值注册个监听器,一旦B系统处理完了就修改那个节点的值,A立马就可以收到通知分布式锁对某一个数据连续发出两个修改操作,两台机器同时收到了请求,但是只...

2019-05-23 15:19:48 158

原创 dubbo

系统拆分:流程系统,拆分为画图系统(画图系统,流程文件系统),单点登陆系统,后台管理系统,订单系统,基础模块系统,ELK系统,搜索系统,论坛系统为什么要将系统拆分?一个大系统几十万行代码,N个人维护一份代码,merge耗时;每次上线都要做复杂的检查,很多异常要处理;技术升级可能导致有些部分不能用;发布时每个人都要看自己那块有没有问题怎么拆,怎么分?一个人负责2-3个系统...

2019-05-22 11:50:52 94

原创 Redis杂记

系统用途查看流程文件,查看流程图,缓存实现高性能,流程文件是流程图,制度等多个数据组合得到,缓存复杂查询缓存走内存,内存天然就可以支撑高并发,数据库并发请求建议用不超过2000Redis单线程效率高的原因:底层采用文件事件处理器来处理请求,其是单线程的,所以redis是单线程的,采用IO多路复用,非阻塞,纯内存操作,没有多线程上下文切换内存淘汰机制:allkeys-lru:移除...

2019-05-19 19:01:08 118

原创 ES 杂记

ES 适用于大数据,高并发,QPS 5000没问题ES概念Index 存储方案,类似特性的文档集合Type 索引内部的逻辑分区,相当于表Mapping 表结构定义...name,conten.....Document 原子单位,包含一个或多个Field的容器,File对应mapping表结构的定义Inverted Index 倒排索引会按照指定语法对每一个文档进行分词,然...

2019-05-16 13:46:40 357

原创 MQ 杂记

文件上传,短信,画图、截图(削峰)消息队列(解耦,削峰(早上10点,下午三点),异步),高峰QPS每秒2万,低峰期每秒几百redis:验证码,手机安全码,流程文件,流程图,流程文件,最新列表:lpush,排行榜:sorted set 秒杀引入mq的缺陷可用性降低,复杂性 插入重复数据:幂等性,数据库,查修改;redis天然幂等性;生成唯一id,先去redis里面查,没有就...

2019-05-15 17:11:17 137

原创 Spring源码之AOP

如果申明了自定义的注解,那么就一定会在程序中的某个地方注册了对应的解析器,Aspect也有对应的标签处理器,进过全局搜索,我们发现在AopNamespaceHandler中 public void init() { // In 2.0 XSD as well as in 2.1 XSD. registerBeanDefinitionParser("config", new Confi...

2019-04-07 14:23:48 95

原创 Spring—容器的功能扩展

本文基于ApplicationContext的实现类ClassPathXmlApplicationContext作为切入点,开始对整体功能进行分析。public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws Beans...

2019-04-06 22:09:07 201

原创 Tomcat总体架构详解

本文从最基本的功能一层一层的演进tomcat的架构从最基本的功能来讲,我们可以将服务器描述成这样一个应用:它接受客户端发来的请求数据解析完成相关业务处理后把结果返回给客户端。下图是一个最简单的服务器设计图:我们通过start()方法启动服务器,打开socket链接,stop()方法 停止服务器并释放网络资源。很快我们就会发现,将请求监听与请求处理放再一起扩展性能很差,比如当我们想适配多...

2019-03-25 19:09:43 129

原创 Spring源码——bean的加载

经过上一节的分析,我们完成了通过xmlBeanFactory容器初始化的内容,后面会继续讲解关于AplicationContext容器初始化的讲解。这一节我们主要分析的是bean的加载,及getBean方法的过程及原理实现。首先我们整体看一下getBean方法真正的执行者doGetBean方法,该方法在AbstractBeanFactory中,下面进入正题!@Override public...

2019-03-24 19:54:14 134

原创 基于XmlBeanFactory的Spring容器源码分析

直接使用BeanFactory作为容器对于Spring来说并不多见,至少也得用ApplicationContext,甚至是在官方已经遗弃了XmlBeanFactory的情况下还用其来分析的原因是为了能够更好更快地分析Spring的内部原理 BeanFactory b = new XmlBeanFactory(new ClassPathResource("test.xml"))...

2019-03-23 22:44:07 135

原创 MyBatis Spring整合源码解析

MapperScan源码分析?mapperScan如何生效的?在项目中大多数用的都是@MapperScan注解,指定basePackages,扫描mybatis Mapper接口类,另外一种方式是用@Mapper注解,其实这两种方法扫描配置用的是一个地方,只是扫描入口不同。@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TY...

2019-03-20 16:41:43 350

原创 Mybatis两级缓存深入理解

mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解:一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。 二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句...

2019-03-14 18:39:26 282

原创 ThreadPoolExecutor源码解析之机制原理篇

线程池可以解决两个不同问题:由于减少了每个任务的调用开销,在执行大量的异步任务时,它通常能够提供更好的性能,并且还可以提供绑定和管理资源(包括执行集合任务时使用的线程)的方法。每个 ThreadPoolExecutor还维护着一些基本的统计数据,如完成的任务数。这是ThreadPoolExecutor文档中的说明。线程池其实就是把你提交的任务(task)进行调度管理运行,但这个调度的过程以...

2019-03-10 17:26:33 290

转载 atomic包解析

Atomic包是Java.util.concurrent下的另一个专门为线程安全设计的Java包,包含多个原子操作类。这个包里面提供了一组原子变量类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入,这只...

2019-03-10 15:02:31 225

原创 ConcurrentLinkedQueue深度解析

并编程中,一般需要用到安全的队列,如果要自己实现安全队列,可以使用2种方式:加锁,这种实现方式就是我们常说的阻塞队列。 使用循环CAS算法实现,这种方式实现队列称之为非阻塞队列。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,本节我们就来研究下ConcurrentLinkedQueue是...

2019-03-09 19:33:18 812

原创 ConcurrentHashMap精

本文着重讲解ConcurrentHashmap的源码实现和原理,JDK8中ConcurrentHashmap摒弃了分段锁技术的实现,直接采用CAS和Synchronized保证并发更新安全性,底层采用数组+链表+红黑树的存储结构。其数据结构如下:说明:数据结构采用数组 + 链表 + 红黑树的方式实现。当链表中的节点个数超过8个时,会转换成红黑树的数据结构存储,这样设计的目的是为了减少同一个...

2019-03-08 16:06:39 130

原创 CountDownLatch 实现分析及示例

CountDownLatch是一个同步的辅助类,它可以允许一个或多个线程等待,直到一组在其它线程中的操作执行完成。一个CountDownLatch会通过一个给定的count数来被初始化。其中await()方法会一直阻塞,直到当前的count被减到0,而这个过程是通过调用countDown()方法来实现的。在await()方法不再阻塞以后,所有等待的线程都会被释放,并且任何await()的子调用...

2019-03-06 18:22:18 799

原创 CycBarrier深度解析和示例

现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。例如吃饭时要等全家人都上座了才动筷子,旅游时要等全部人都到齐了才出发,比赛时要等运动员都上场后才开始。栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。CyclicBarrier可以使一定数量的线...

2019-03-06 17:24:19 735

原创 ReentrantReadWriteLock精华理解

ReentrantLock在并发情况下只允许单个线程执行受保护的代码,而在大部分应用中都是读多写少,所以,如果使用ReentrantLock实现这种对共享数据的并发访问控制,将严重影响整体的性能。ReentrantReadWriteLock中提供的读取锁(ReadLock)可以实现并发访问下的多读,写入锁(WriteLock)可以实现每次只允许一个写操作。ReentrantLock有两个锁:一...

2019-03-05 14:44:01 291

转载 ReentrantLock详解

在Java中通常实现锁有两种方式,一种是synchronized关键字,另一种是Lock.synchronized是基于JVM层面实现的,而Lock是基于JDK层面实现的。Lock在硬件层面依赖CPU指令,完全由Java代码完成,底层利用LockSupport类和Unsafe类进行操作;虽然锁有很多实现,但是都依赖AbstractQueuedSynchronizer类,我们用ReentrantLo...

2019-03-05 13:09:43 244

转载 JAVA Condition 详解

synchronized 关键字,配合Object的wait()、notify()系列方法可以实现等待/通知模式。对于Lock,通Condition也可以实现等待/通知模式。Condition时一个接口,其实现类是AQS中的ConditionObjectLock对象通过newCondition()方法可以获得Condition对象(其实就是ConditionObject)Lock l...

2019-03-05 11:44:03 392

转载 AQS同步构造器

什么是AQS?AQS的核心思想是基于volatile int state这样的volatile变量,配合unsafe工具对其原子性的操作来实现堆当前锁状态的修改,同步器内部依赖一个FIFO的双向队列来完成资源获取线程的排队工作。并发控制的核心是锁的获取与释放,锁的实现方式有很多种,AQS采用的是一种改进的CLH锁。那么设么是CLH锁呢?CLHCLH(Craig, Landin, and...

2019-03-02 15:55:46 97

原创 DCL单例模式,如何解决DCL问题

何为DCL,DCL即Double Check Lock,双重检查锁定。下面从几个单例模式来讲解懒汉式public void Singleton{ private static Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(...

2019-02-27 19:14:41 4243 3

原创 synchronized原理分析及自旋锁、偏向锁、轻量级锁和重量级锁的概念和优化

诚然,我们一提到并发编程,首先想到的可能应该就是synchronized,无可厚非其作用。大多数人都会称呼其为重量级锁,但是随着JAVA1.6对synchronized的优化,其变得不再那么重了。1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。下面我们一起来探究synchronized的实现机制以及Java是如何对其进行优化的。从宏观上分析,锁...

2019-02-25 18:17:28 4906

原创 JAVA内存模型(JMM)

关于JAVA并发问题,首先我们需要先了解JAVA内存模型,及常说的JMM。那么什么是JMM:Java内存模型(即Java Memory Model,简称JMM)本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。关于JMM,我们首先先了解一下JAVA的内存结构。Java虚拟机在执行Java程序的...

2019-02-23 18:58:53 182

原创 JDK8 HashTable 源码分析

话不多说,直接上菜.............      Hashtable存储的内容是键值对(key-value)映射,其底层实现是一个Entry数组+链表;    Hashtable和HashMap一样也是散列表,存储元素也是键值对(JDK8 hashmap 加入了红黑树机制);    HashMap允许key和value都为null,而Hashtable都不能为null,H...

2019-02-19 19:52:04 230

原创 JAVA8 HashMap 源码分析,这一篇就够了

本文不对hashMap与Hashtable、ConcurrentHashMap等的区别,重点探讨hashMap的原理。 相较于JDK7,总的来说,JDK7中的hashMap底层采用了数组+链表的数据结构实现数据存储,随着存储数据量的增大,Hash碰撞会越来越频繁。也就意味着链表会越来越长,查找效率不断降低。        JDK8的出现解决了这个问题,对与hashMap采用了新的数据结构...

2019-02-19 12:47:25 204

空空如也

空空如也

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

TA关注的人

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