自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 java8 ThreadPoolExecutor之shutdown()与shutdownNow()的相同与不同

研究ThreadPoolExecutor源码时,发现两个方法:shutdown()和shutdownNow(),从名字上看都是关闭,只是后者多了一个Now,那么它们两个有什么区别呢?首先先来看代码: public void shutdown() { final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { checkShutdownAccess()

2021-01-31 18:47:30 761

原创 java8 ThreadPoolExecutor线程池原理详解

创建线程是一个非常耗时的操作,所以一般在系统中都会创建一个线程池,当有需要执行的任务时,直接从线程池中获取一个线程执行。在java里面,一般使用类ThreadPoolExecutor创建线程池。本文接下来详细介绍ThreadPoolExecutor的原理。本文目录一、ThreadPoolExecutor的例子二、源码分析1、准备知识2、execute()3、addWorker()4、remove()5、reject()6、Worker类一、ThreadPoolExecutor的例子下面先看一个Thr

2021-01-31 12:19:06 546 1

原创 java8 Semaphore原理详解

阅读本文前,请先查看《java8 多线程并发之AQS详解》和《java8 ReentrantLock加解锁原理详解》,本文是在前面两篇文章基础上的延续。Semaphore类表示信号量,初始时我们设置一个信号量初始值,该初始值可以为任意值(负数也可以,一般为正值),每个线程可以申请一定量的信号量,如果信号量不够,则阻塞线程,每个线程执行完,会将信号量释放,以供后续线程申请使用。Semaphore允许多个线程同时持有一定量的信号量,因此Semaphore相当于共享锁,信号量初始值就相当于锁的个数,只要线程持有

2021-01-30 18:05:49 491

原创 java8 ReentrantLock加解锁原理详解

在文章《java8 多线程并发之AQS详解》里面介绍了AQS的实现原理,ReentrantLock便是基于AQS实现的可重入锁。本文将详细介绍ReentrantLock的实现原理。文章目录一、ReentrantLock二、源码分析1、Sync2、FairSync3、NonfairSync参考文章一、ReentrantLockReentrantLock实现了接口Lock,先来看一下Lock的定义:public interface Lock { //申请锁,如果没有申请到,则阻塞当前线程 //屏蔽线

2021-01-30 15:34:35 460 1

原创 java线程状态及转换关系

在类Thread.State中,定义了6个枚举类型,它们分别代表了线程的6个状态:NEW创建了Thread对象,还未调用start方法启动的线程处于这个状态;RUNNABLE:可以在java虚拟机中运行的线程(就绪)或者正在运行的线程;WAITING:线程处于等待状态,调用了这些方法:不带超时值的Object.wait(),不带超时值的Thread.join(),调用了这些方法后的线程处于这个状态;还有是当等待ReentrantLock锁时,也是出于waiting状态,当发生线程中断可以将线程从该状态唤醒;

2021-01-30 12:15:10 343

原创 java8 多线程并发之AQS详解

AQS是类AbstractQueuedSynchronizer的缩写,是一个队列式的同步器,功能是用于限制多线程对资源的访问,在java中,很多与锁或者同步相关的类都依赖AQS,比如ReentrantLock、Semaphore等。对于如何访问共享资源和独占资源,它提供了一个基本的框架。一、基本原理AQS内部有一个类似于锁或者通行证的属性字段,线程每次访问资源前,都需要调用AQS中的方法获得这个锁,如果没有拿到锁,则将该线程放入一个等待队列的尾部,并置线程状态为waiting,线程进入休眠状态。资源访

2021-01-30 00:22:04 588 2

原创 java8 常用集合类汇总详解之Map

Map接口常用的实现类有:ConcurrentHashMap、Hashtable、TreeMap、LinkedHashMap、HashMap。HashMap是我们最常用的Map实现类。默认装填因此是0.75,默认初始容量是16,其中装填因子只能通过构造函数设置。在构造函数中也可以设置初始容量,如果初始容量不是2的次幂,HashMap会将其修改为大于且最接近当前设定值的2的次幂值。当元素比较少时,HashMap的结构如下图:

2021-01-24 16:23:53 670

原创 java8 常用集合类汇总详解之Queue

Queue是队列的接口,其常用实现类有ArrayBlockingQueue、SynchronousQueue、PriorityQueue、LinkedBlockingDeque、DelayQueue、LinkedBlockingQueue、ConcurrentLinkedQueue、PriorityBlockingQueue、LinkedList、ArrayDeque、ConcurrentLinkedDeque。它们之间的关系如下:根据实现接口的不同,它们分成三大类:普通队列、双向队列、阻塞队列。一、

2021-01-23 22:28:42 629

原创 java8 常用集合类汇总详解之Set

接上一篇文章《java8 常用集合类汇总详解之List》,本文介绍集合Set。Set的实现类主要是HashSet、TreeSet、LinkedHashSet、CopyOnWriteArraySet。**Set有一个最大的特点就是没有重复元素。**因此可以使用Set去重。Set接口没有提供像List.get()一样直接获得某个指定元素的方法,不过它提供遍历所有元素的方法。1、HashSetHashSet其实是基于HashMap实现的,下面是该类的构造方法: public HashSet() {

2021-01-23 15:12:14 676 1

原创 java8 常用集合类汇总详解之List

java提供了众多的集合类,比如List、Set等,本文及后面的几篇文章将对常用的集合类的实现原理做汇总介绍。一、集合类的接口下图是常用的集合类接口。接下来对每个接口,我都找出常用的实现类,介绍一下它们的实现原理。二、ListList的实现类主要是ArrayList、LinkedList、Vector、CopyOnWriteArrayList、Stack。1、ArrayListArrayList是使用数组实现的线性表,或者说是使用顺序存储结构实现的线性表。它内部有一个数组elementDa

2021-01-23 13:15:43 1440 3

原创 java8 集合类中Spliterator的快速失败和后期绑定

java8在TreeSet、ArrayList等这样的集合类中提供了创建Spliterator对象的方法,创建的Spliterator对象的数据源便是这些集合对象,这样便可以通过Spliterator遍历元素。本文接下来探讨Spliterator遍历元素时快速失败和后期绑定问题。**这里首先强调一点:Spliterator不是线程安全的,如果多线程访问Spliterator需要做同步处理。**

2021-01-23 00:12:32 192

原创 java8 Stream之Spliterator

Spliterator是java8新增的接口,意思为分割器或者分离器,作用是遍历元素或者将数据源的数据分割成几个部分。Spliterator的实现类非常多,这也体现了该接口的重要性。下图Stream中比较重要的几个类的继承体系:绿框表示实现类,蓝框表示接口。因为Integer、Long、Double比较特殊且常用,所以单独提供了Spliterator的实现类,不过原理与类ArraySpliterator都是一样的。上图中Spliterator的直接实现类分为四个,主要原因是它们的数据源不同。

2021-01-21 23:25:02 1590 2

原创 Sentinel-新手从零开始搭建限流框架

本文基于sentinel-1.8.0版本一、搭建sentinelsentinel核心jar包不依赖任何框架/库,能够运行于Java 7及以上的版本的运行时环境。下面分四步运行起来一个sentinel。1、引入依赖sentinel的核心只依赖于sentinel-core,在pom文件里面配置如下依赖:<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentine.

2021-01-19 23:13:50 905 2

原创 java8 stream运行原理之并行流原理详解

上一篇文章《java8 stream运行原理之顺序流原理详解》介绍了顺序流的执行原理,本文接着上一篇介绍并行流的执行原理。一、如何创建并行流调用parallel()方法可以创建并行流,如下: public static void main(String argv[]){ Stream<String> stream=Stream.of("1","2","","123"); stream.filter(x->x.length()>=1).par

2021-01-17 13:28:52 2059

原创 java8 stream运行原理之顺序流原理详解

接下来将通过两篇文章介绍stream的原理,本文介绍顺序流,下篇文章介绍并行流。一、顺序流原理总述下图是Stream的继承结构:蓝框表示接口,灰框表示抽象类,绿框表示非抽象类。因为Integer、Double、Long比较常用且特殊,java8提供了专门的Stream类。不过这三个类的原理与ReferencePipeline是一样的,本文接下来就以ReferencePipeline为例做介绍。ReferencePipeline是最常用的流对象,一般使用的流对象都是该类。该类是抽象类,它有三个子类

2021-01-17 11:12:44 2428

原创 java8 详解时间日期API

在使用java8以前的时间日期类的时候,总觉得这一块有点蹩脚:java.util.Date和java.sql.Date,不知道为啥定义两个同名的类,而且后者还没有默认的构造方法;日期类格式化类SimpleDateFormat居然是在java.text包下;推荐实用Calendar获取Date对象的年月日时分秒,不过从名字上很难感觉到两者之间有什么关联。还有一些其他的问题我不再一一说明了,下面是从网上找到的关于时间日期类的问题总结:非线程安全:java.util.Date、java.util.

2021-01-15 22:37:45 348

原创 Java 8 lambda表达式及方法引用实现原理

lambda表达式不仅使编码简洁,而且可读性也大大提升。真的很佩服设计这个功能的开发人员。在佩服之余,不禁思考这个功能的实现原理是什么?带着这个疑问,先从网上查阅资料,发现了下面这篇文章,https://www.cnblogs.com/WJ5888/p/4667086.html这篇文章详细介绍了lambda表达式的实现原理,读完之后很受启发,于是我使用文章中的方法进一步探究方法引用的实现原理。本文接下来分为两个部分,第一部分主要介绍lambda表达式的实现原理,第二部分主要介绍方法引用的实现原

2021-01-12 21:14:23 1496 4

原创 Java 8 新特性之接口默认方法和静态方法

java8里面,接口迎来两个重大变化,一是可以定义static方法,二是可以定义default方法,也叫作默认方法或虚拟扩展方法或防护方法。相比于普通类里面的静态方法,接口里面定义static方法没有特殊要求,和普通类里面定义静态方法规则基本都是一样的。接口的静态方法可以通过接口直接调用,而且静态方法必须是public的。下面主要介绍默认方法。先给一个例子:public interface A { default A createA(){ return new AImpl()

2021-01-10 21:55:18 270

原创 Java8 新特性之全面解析方法引用

文章目录一、什么是方法引用二、方法引用有哪些类型1、引用静态方法2、引用构造方法3、引用实例方法4、引用某个类的任意实例方法一、什么是方法引用方法引用是java8的新特性之一,它使得编写代码的时候可以通过方法名直接引用一个已经存在的方法,这样可以使代码简洁紧凑,避免重复编码。方法引用使用两个冒号(::)表示,比如下面代码:Stream.of(1,2,3,4).forEach(System.out::println);下面再举一个例子,让大家先来体验一下方法引用带来的方便。public stat

2021-01-10 17:51:26 220

原创 Java8 Stream:实例详细介绍遍历、筛选、归约、分组、聚合操作

文章目录一、什么是Stream一、什么是StreamStream是java8新加的特性,它将数据看做一个流,数据从源流入,中间经过一些操作,最后流出,Stream就像一个管道一样,数据是流经管道中的水。流经Stream的这些数据来源可以是数组,集合,甚至是一个有返回值的方法。在Stream里面,数据经过的操作分为两种:中间操作:终端操作:...

2021-01-10 13:56:29 2362

原创 SpringMVC-SpringMVC如何处理Controller抛出的异常

本文基于spring 5.5.2.release本文要介绍的不只是Controller抛出的异常,自定义的拦截器也会抛出异常,而且运行过程中springmvc自身也会抛出异常,本文就来分析一下springmvc如何处理这些异常。文章目录一、什么场景下会抛出异常二、如何处理异常一、什么场景下会抛出异常在进入正题前,先来分析一下都有哪些地方会抛出异常。springmvc自身缺陷导致异常,不过这种异常几乎不可能出现;开发人员自己编写的Controller处理过程中抛出的异常,这种异常占绝大部分,.

2021-01-06 22:15:19 2521

原创 leetcode-31. 下一个排列

题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?分析:不考虑进阶要求的话,这个题目很简单,要找倒数第n个节点,首先遍历一遍,找到链表的总长度length,然后length-n+1就是从链表头开始数要删除的节点了。然后再从头开始遍历找到

2021-01-03 11:14:35 98

原创 SpringMVC-视图解析器ViewResolver详解

本文基于spring 5.5.2.release前几篇文章介绍了springmvc调用Controller的处理流程,现在已经知道调用Controller之后可以得到ModelAndView对象,那么如何根据ModelAndView对象得到View对象,这就需要借助视图解析器ViewResolver了。文章目录一、ViewResolver1、BeanNameViewResolver2、ViewResolverComposite3、InternalResourceViewResolver4、Conte.

2021-01-02 22:07:07 3009

原创 leetcode-29. 两数相除

题目:两数相除给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2示例 1:输入: dividend = 10, divisor = 3输出: 3解释: 10/3 = truncate(3.33333…) = trun

2021-01-02 15:29:21 160

原创 SpringMVC-处理http请求的中间桥梁HandlerAdapter之RequestMappingHandlerAdapter

本文基于spring 5.5.2.release本文将详细介绍RequestMappingHandlerAdapter如何处理http请求。文章目录一、可以处理什么类型的Handler二、处理HTTP请求的详细过程1、模型上下文2、使用HandlerMethodReturnValueHandler处理返回值3、创建ModelAndView对象三、总结一、可以处理什么类型的Handler我们知道HandlerAdapter提供了supports方法来检查它是否支持处理当前的Handler对象。R.

2021-01-01 20:46:11 421

原创 SpringMVC-处理http请求的中间桥梁HandlerAdapter

本文基于spring 5.5.2.release前面几篇文章介绍了接口HandlerMapping,了解到该接口的作用是根据请求参数查找Handler,这个Handler并没有具体的要求,可以是一个普通的bean对象。从HandlerMapping的方法返回值上可以看到,...

2021-01-01 14:57:45 272

空空如也

空空如也

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

TA关注的人

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