自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(122)
  • 资源 (2)

原创 如果线程池中线程任务已经执行完毕了,当前线程的状态是怎样的?

1.代码样例int corePoolSize = 2; int maximumPoolSize = 4; long keepAliveTime = 20; TimeUnit unit = TimeUnit.SECONDS; ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, ma...

2020-02-03 10:15:19 1702

原创 带你阅读spring容器源码创建过程

一.引言 在java体系中,spring是一个非常出名的框架。它包含了很多东西,但是IOC容器是它的基本功能,这个不可不知。二.spring容器加载方式在spring中,主要有三种方式加载容器:1.使用类路径加载配置文件ClassPathXmlApplicationContext("bean.xml")2.使用文件系统加载配置文件FileSystemXm...

2019-06-02 18:36:00 286 2

原创 httpclient大量请求网络拒绝 Connection pool shut down

1.背景描述项目中每次400条数据递归网络请求第三方数据,该次递归总的数据量有220000左右,可以算出大概需要550次调用。但是数据跑到13W左右,程序中断。2.案例分析①.系统跑了一遍,没有看到任何日志。分析: 因为是多线程应用,一开始以为是线程池写法有误,导致数据库连接用完,解决:使用自定义连接池上了一版,并且加上了日志。②.系统再跑了一遍,发现日志报错...

2019-05-30 10:38:57 3194 2

原创 消息顺序调度器--pmoc

一.说明 框架主要解决消息按顺序消费问题,比如 1,2,3,4,5 ,可以一次性将消息消费完。 3,2,7 第一次只能消费3,第二次可以消费2,7 项目中主要支持两个配置方式,redis模式,mysql模式 具体配置看代码[pmoc-core]config.driver包二.架构设计 项目中主要完成了redis模式的实现 redis: 设计了...

2019-05-19 18:52:40 144 1

原创 手写分布式配置中心

一.引言 随着微服务架构的兴起,分布式配置中心越来越必不可少。目前比较流行的有携程的Apollo,阿里的disconf,淘宝的diamond。二.原理 其实实现原理可以简单的概括如下:客户端先集成框架,在启动的时候已经将客户端的ip和端口发送到了注册中心(比如zookeeper),再设置具体某个值得时候,发送给服务器端,服务器端接收到请求后,依次通知之前注册的机器。这样随便...

2019-04-15 23:40:55 395 2

原创 算法题:一个圆环上有100个灯泡,灯泡有打开和关闭两种状态,灯泡的状态随机,按一个灯泡的开关,相邻的两个灯泡的状态也发生一次变化。比如暗-亮-暗,按中间灯泡,变化为亮-暗-亮。问设计一道算法,使得所有

算法题:一个圆环上有100个灯泡,灯泡有打开和关闭两种状态,灯泡的状态随机,按一个灯泡的开关,相邻的两个灯泡的状态也发生一次变化。比如暗-亮-暗,按中间灯泡,变化为亮-暗-亮。问设计一道算法,使得所有灯泡最后都亮。解答:第一阶段,如果给100个灯泡编号0~99 ,顺序往下走,如果灯是亮的就不管,灭的就按下后面灯泡使这个灯亮(在第一循环内,也就是还没有从99走到0)。如果都是亮的那正好万事大...

2019-04-12 18:57:47 1778 3

原创 延时job设计

一.设计初衷           目前系统系统job任务是每10分钟重试一次,总共重试7次。所有需要重试的请求都在10分钟之内堆积,如果请求量过大,这个时间点压力都有可能落到数据库上面,从而造成数据库崩溃。    此外时间配置不够智能化。如果两小时之后所依赖的第三方系统稳定,而目前的重发机制相当于失效了。 基于上面两个原因,提出了改进方案,使用延时job实现功能!二.功能原理   ...

2018-11-23 17:50:14 236 5

原创 接口幂等设计

一.引言      在系统设计时,经常会出现每次操作结果都需要一致的场景。比如典型的restful get请求 ,每次请求url/student/1(查询第一个学生),结果都是一样的。当然排除再修改学生信息后又查询的情况。     接口幂等,通俗的定义可以为:每次同样的请求操作该接口,得到的结果都是一样的。二.实现方式      先给个场景,同样的订单编号发起两笔支付,按道理数据库...

2018-10-24 21:55:33 241 1

原创 手写基于redis实现分布式限流器-pdlr

一.限流器介绍    简单来讲,限流器就是控制流量访问速率的一种机制,在短时间内大量流量访问时,不至于使服务器崩溃。比如,一分钟之内,如果限制1000个请求可以访问,当第1001个请求到达时,请求被拒绝(这时最好对其进行监控)。二.限流器的实现方式    目前常用两种:    1.使用计数器法。一段时间内,限制请求可以访问的个数,guava框架里面有一个ratelimit。  ...

2018-08-04 13:18:35 621 1

原创 手写springmvc--PMVC

一.引言      在java体系中,说起架构,spring不可不谈,而它的一个子产品-springMVC在web开发中有着举足轻重的地位。由于spring不在讲解之列,这里就默认大家都会spring或者用过。二.架构    对于springmvc架构的理解,相信很多人都有自己的一套理解。但是都绕不过HttpServlet这个类。springmvc是基于该类的。先看一下这个类的集成层次httpSe...

2018-07-06 16:13:53 377 4

原创 一个字段首字母大小写引发空值

一.引言     昨天同事反馈热配置的值一直赋值不上去,之前也是这样操作的,按道理没有问题。今天有时间就看了下源码。二.分析     首先交代一下代码场景:一个类(A)里面设置了三个字段 KFC,MyTest,age(这三个字段都是我随便取的),其中,KFC,age两个字段都已经获取到了值,而MyTest这个字段没有值。     怎么办?只能一步一步的追代码了。重点:看到类里面的字段名变成了myT...

2018-06-27 21:37:04 383 3

原创 如何理解阻塞,非阻塞,同步,异步

一.问题引出之前和朋友讨论多线程问题的时候,朋友问了一下阻塞和同步的区别,当时顿时懵逼了。这两个概念给人最直接的感受就是:阻塞也是等,同步也是等呀!好像没什么区别吧。二.概念阻塞和非阻塞都是通常用来形容多线程间的相互影响。比如一个线程占用了临界资源,那么其他所有需要这个临界资源的线程都要在临界区等待,等待或造成线程的挂起,这种情况就是阻塞。它会一直尝试做,直到完成。平常用到的锁基本上就是阻塞的。非...

2018-06-26 20:40:34 208 1

原创 实际开发中两个有意思的优化

一.引言在互联网开发过程中,响应速度应该也是程序开发特别要关注的点之一。下面讲讲开发中两个优化。二.事件1.接口A(XXX)        在写接口A的时候,需要用到订单信息,而这个下游的接口有时响应时间在300ms,它是放在首页被异步调用的。有人说反正是异步调用,300ms也不是很慢呀!用不着优化吧!确实300ms是在用户可以忍耐的极限内,但是自己代码只要几ms,调用别的接口用了这么多,着实这个...

2018-06-26 20:06:16 162 1

原创 ReentrantLock之公平锁,可重入的理解

一.问题ReentrantLock是jdk5里面的一个方法类,主要讨论两个问题:1.ReentrantLock的可重入体现2.ReentrantLock的公平锁和非公平锁体现二.讲解2.1ReentrantLock的可重入体现...

2018-06-26 19:44:58 1060 2

原创 future的简单实现

一 .入门相信大家使用过线程,对future应该不会陌生吧! 在java一种最简单的使用是Callable,比如:public class A implements Callable<String> { @Override public String call() throws Exception { return "aaa"; }}@org....

2018-06-21 14:54:42 539 1

原创 高并发下ArrayList空值(null)问题

对于ArrayList,有一篇blog专门的介绍,它不适用于多线程环境中,废话不多说,直接上代码让大家看个明白!public class ArrayListTest { @Test public void test() { List<Person> personList = new ArrayList<>(); for (in...

2018-06-20 12:30:49 4918 4

原创 《effective java》builder模式一些思考

      在java中,对于类中属性赋值,大部分情况下会使用set,get,可能还有些boolean的属性有些框架会用is做为前缀。但是对于一个类中有多个参数,总不能set多个参数或者构造函数中写多个参数的构造吧。在idea中生成构造函数和set/get方法都是有快捷方式的,但是在使用的时候就痛苦了。对于这个问题,有没有什么好的解决方法呢?《effective java》中推荐使用bulder模...

2018-05-05 22:45:41 497 1

原创 分布式锁实现方案

在高并发场景中,我们需要对资源上锁。比如在秒杀商品时,大量请求过来,不上锁可能导致超卖等现象的发生。大家都知道在java中,它自身就提供了很多锁,synchronized,lock,ReentrantLock....它们可以工作在单机项目里面,但是在分布式项目里面,他们就不能保证对全局资源的掌控了。那如何实现在分布式环境中对全局资源的掌控呢?(声明,此处只探讨数据库和redis实现)1.数据库实现...

2018-05-05 19:25:24 364 1

原创 shell命令实现服务的全启动

    有时候在单机服务器部署中,会启动好几个软件(排除用docker),比如nginx,redis,tomcat,mysql 。。。。  以前     在不知道服务装在哪里的情况下,可以用whereis命令查看文件的位置。     $ whereis nginx      nginx: /usr/local/nginx    然后     cd /usr/local/nginx      ls ...

2018-05-01 23:27:48 3819 4

原创 java排序--堆排序

一.简介       上一篇讲了快速排序,这一篇来讲讲堆排序。堆可以借助借助完全二叉树来理解,数值排列按照广度优先算法输出的顺序给出。堆排序分按大堆排序和小堆排序。堆排序就是一趟排序完,最大的值在最前面;而按小堆排序就是一趟排序完,最小的值在最前面。       排序过程为使记录序列按关键字非递减有序排序,则在堆排序的算法中,先建一个“大顶堆”,即先选得一个关键字为最大的记录并与序列中最后一个记录...

2018-04-29 21:48:48 217 1

原创 java排序---快速排序

一.简介       在排序算法中,快速排序算是里面的佼佼者。它是对冒泡排序的一种改进,基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。这里提到了分割成两部分,使我们想到了分而治之的思想,其实就是让另外两部分分别去实现之前的排序而已。因为要找出关键字,用关键字来分割两部分,所以最好的情...

2018-04-27 01:30:58 210 2

原创 调用线程的yield()方法会不会只让优先级相同的执行?

     在一些blog上面,对于线程的yield(),他们对调用这个方法的的描述为,只会将运行权让给相同优先级或更高的优先级执行。这样就很容易使读者以为,如果有两个线程a和b,a的优先级大于b的优先级,即使a调用了yeild()方法,由于b的优先权低于a,那么线程需要等a运行完之后b才有机会运行,是这样的?public class YieldTest extends Thread { ...

2018-04-26 00:10:36 2854 3

原创 教你代码实现抢红包功能

一.场景带入抢红包在现实场景中经常见到,你知道如何通过代码来实现吗?一种通常的思路是,一定金额的红包,只要有人过来抢,就在剩余数额内给他分配金额,直到所有钱都分陪完。但是这样有一个问题,最先抢的人,抢到钱多的概率会更大。比如有10块钱,有甲乙丙三个人按顺序抢,甲开始抢,这时他抢红包的数额范围是0到10,平均是5云,假设甲抢了4元。乙开始抢,这时他抢红包的数额范围是0到6元,平均是3元,假设乙抢了4...

2018-04-23 22:25:52 9497 25

原创 浅谈后端高并发的几种设计方法

在高并发的应用场景中,前端需要更快的渲染速度,而后端不仅需要更快的接口速度,而且还需要保证数据的一致性。前端设计中可能会有静态页面,cdn等的优化手段,在后端架构中,通常也需要引用高并发程序的解决方案。下面主要谈谈后端的处理方案。分层后台主要有两块,一块是数据库,一块的业务块,当然业务层里面还可能包含对别的服务调用。数据库层使用的优化手段1.分库分表。但是在做设计的时候最好考虑到在不停机的状态下可...

2018-04-23 01:33:17 6157 4

转载 JAVA 中BIO,NIO,AIO的理解

在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解。具体如下: 序号问题1什么是同步?2什么是异步?3什么是阻塞?4什么是非阻塞?5什么是同步阻塞?6什么是同步非阻塞?7什么是异步阻塞?8什么是异步非阻塞?在弄清楚上面的几个问题之前,我们首先得明白什么是同步,异步,阻塞,非阻塞,只有这几个单个概念理解清楚了,然后在组合理解起来,就相对比较容易了。 1,同步和异步是针对应用程序和内核的...

2018-04-23 00:24:21 170 1

原创 java源码系列

之前都是一篇一篇文章写的,发布时间不一,比较散乱,特整理如下:详细解析jdk7HashMap源码源码解读--ArrayList源码解读--Stack源码解读--Queue源码解读--LinkedList源码解读--HashSet    源码解读--HashMap(jdk8)源码解读--线程池TheadPoolExecutor深入讲解源码解读--LinkedBlockingDeque讲解源码解读--...

2018-04-21 20:05:54 909 1

原创 源码解读--AbstractQueuedSynchronizer讲解之Reentrantlock实现

一.锁  说起AbstractQueuedSynchronizer(传说中的AQS),可能有些同学不知道,但是说到ReentrantLock,CountDownLatch,Seamphore,大家可能用用过吧。他们都是用锁来实现了,而锁里面又分独占锁和分享锁。具体锁的种类请看文章。ReentrantLock是独占锁,而CountDownLatch,Seamphore是分享锁。锁里面还有一个重要的分...

2018-04-21 17:53:24 158 1

转载 JAVA锁有哪些种类,以及区别

在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下:公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁...

2018-04-21 14:42:18 415 1

原创 记一次生产问题--CompletableFuture默认线程池

在jdk7中,我们使用线程池可能会使用ExecutorService,默认有四种方式Executors.newSingleeThreadPool()Executors.newFixedThreadPool()Executors.newCacheThreadPool()Executors.newScheduledThreadPool()在jdk8中,CompletableF...

2018-04-20 02:18:53 14598 15

原创 一个队列如何找出倒数第k个值

问题:一个队列如何找出倒数第k个值?解:第一种:如果这个队列是一个单项指针的队列,里面的结构如下                                        这样的话,可以建两个指针,一个循环到底的时候,控制两次指针相差k个元素,一个指针指向队列尾,另一个指针指向队列倒数第k个元素。第二种:如果这个队列是一个单项指针的队列,里面的结构如下                     ...

2018-04-19 13:14:30 533

原创 源码解读--LinkedBlockingDeque讲解

   在上一遍线程池的讲解中,如果线程的大小大于核心线程的大小,就会放到缓冲队列里面,这个队列就是LinkedBlockingDeque。下面就来深入讲解一下这个队列。java源码系列。一.LinkedBlockingDequ的定义首先看下图谱它是一个队列,而且还是阻塞式的,还可以告诉你,它是线程安全的。LinkedBlockingDeque用的是一个双向的链表,Node的声明如下:static ...

2018-04-19 12:50:26 431

原创 源码解读--线程池TheadPoolExecutor深入讲解

     在使用线程的,我们常使用线程池,线程的复用可以减少线程的开销,很好的提高cpu资源利用率。这篇文章信息量会很大,做好准备哦~ java源码系列。    有对线程池没有直观感觉的同学可以看看这篇文章。在jdk8中,从ThreadPoolExecutor从发,来逐步讲解它的源码实现。1.线程池定义初始值private final AtomicInteger ctl = new AtomicI...

2018-04-18 01:01:32 1492

原创 java中的字符retry: 是什么?

  在看源码时,出现了retry: ,这个是什么意思?之前没有接触过,那先来一个简单的例子。 public void testRetry() { int i = 0; retry: //① while (true) { i++; System.out.println("i=" + i); ...

2018-04-17 16:16:53 3106

转载 java 线程池深入介绍

一简介线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的。在jdk1.5之后这一情况有了很大的改观。Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用。为我们在开发中处理线程的问题提供了非常大的帮助。二:线程池线程池的作用:线程池作用就是限制系统中执行线程的数量。     根据系...

2018-04-16 14:44:18 328

转载 深入讲解volatile关键字

volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。  volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解...

2018-04-16 12:11:43 93

转载 Web系统大规模并发:电商秒杀与抢购

大规模并发带来的挑战在过去的工作中,我曾经面对过5w每秒的高并发秒杀功能,在这个过程中,整个Web系统遇到了很多的问题和挑战。如果Web系统不做针对性的优化,会轻而易举地陷入到异常状态。我们现在一起来讨论下,优化的思路和方法哈。请求接口的合理设计一个秒杀或者抢购页面,通常分为2个部分,一个是静态的HTML等内容,另一个就是参与秒杀的Web后台请求接口。通常静态HTML等内容,是通过CDN的部署,一...

2018-04-15 00:52:28 146

原创 给一个二维数组,横纵坐标随机,里面数值要么是1,要么是0,统计对角是1的个数

问题:给一个二维数组,横纵坐标随机,里面数值要么是1,要么是0,统计对角是1的个数?解析 :首先说一下,怎样的算对角,框成一个矩形是1的就是对角,四点在直线上的值为1组成矩形就算对角。如下图,框起来的都算对角。统计它里面对角的个数?怎么算呢?1. 如果要是对角,肯定一开始那个值为1,它在数组里面的坐标是i,j,即a[i][j] =1。2.还要计算其他三个点是1,就需要在i,j的基础上往下探测,长度...

2018-04-13 23:48:50 462

原创 什么是java中的CAS

问题一:java中的CAS是什么?问题二:为什么要使用CAS?问题三:CAS使用中需要注意什么问题?    这里以提问的方式引出话题,下面带大家慢慢了解CAS。1.CAS的含义CAS是compare and swap的缩写,即我们所说的比较交。cas是一种基于锁的操作,而且是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等一个之前获得锁的线程释放锁之后,下一个线程才可以访问。而乐观...

2018-04-13 02:39:42 16164 4

转载 详解 JVM Garbage First(G1) 垃圾收集器

前言 Garbage First(G1)是垃圾收集领域的最新成果,同时也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命。如果使用Java 8/9,那么有很大可能希望对G1收集器进行评估。本文详细首先对JVM其他的垃圾收集器进行总结,并与G1进行了简单的对比;然后通过G1的内存模型、G1的活动周期,对G1的工作机制进行了介绍;同时还在介绍过程中,描述了可能需要引起注意的优化点。笔...

2018-04-10 23:27:18 155

原创 源码解读--HashMap(jdk8)

一.基础知识之前写过一篇jdk7版的HashMap,今天在此基础上面讲讲jdk8中的HashMap。先来看看他们的不同。java源码系列。1.jdk7中,扩容插入使用的是前插法,jdk8中使用的是尾插法。2.jdk7中使用的是数组+链表的数据结构,查找时间复杂度取决于链表的长度为 O(n)。jdk8中使用的是数组+链表+红黑树(链表的个数大于8的时候,扩展为红黑树)的数据结构,将查找的...

2018-04-10 20:19:27 337

hadoop 2.7 64位编译版本

hadoop 2.7 2.X 64位编译版本 亲测可用 hadoop-2.7.5-64x.tar.gz

2018-02-25

navicat8lite_mysql_cs

很好用的一个工具,可以直接安装,非常方便,有界面哦!

2015-04-21

空空如也

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