java8
文章平均质量分 89
龚厂长
这个作者很懒,什么都没留下…
展开
-
java8 CompletableFuture实现原理详解
Java 8新增加了CompletableFuture类,该类提供了非常强大的Future扩展功能,可以帮助我们简化异步编程的复杂性,提供了函数式编程的能力,可以通过回调的方式处理计算结果,并且提供了转换和组合CompletableFuture的方法。本文接下来首先介绍其基本用法,之后介绍其实现原理。文章目录1、CompletableFuture2、实现原理1、CompletableFutureCompletableFuture实现了Future和CompletionStage两个接口。Futur原创 2021-03-13 15:48:04 · 3828 阅读 · 2 评论 -
java8 ThreadLocal实现原理及内存泄漏原因分析
ThreadLocal,从名字上直译为线程本地,其作用是它为每个线程分配了一个独立空间,每个线程可以在这个空间里面存储自己的变量,线程之间是隔离的,其他线程无法访问本线程的变量。ThreadLocal相当于对每个线程复制了一份数据,每个线程独立的修改自己的那份数据,防止了其他线程修改。本文接下来首先介绍ThreadLocal的实现原理,然后介绍为什么ThreadLocal会出现内存泄漏。文章目录1、ThreadLocal实现原理1、ThreadLocal实现原理...原创 2021-02-15 18:48:33 · 935 阅读 · 2 评论 -
java 谈谈程序中的那些“锁”事
在java中,我们经常碰到各种锁,比如公平锁&非公平锁、乐观锁&悲观锁、可重入锁&不可重入锁、互斥锁&共享锁,如果对这些锁不是很了解,很容易混淆概念。本文将梳理一下这些的锁,介绍它们的不同点,以及如何使用。文章目录1、公平锁&非公平锁2、可重入锁&不可重入锁3、互斥锁&共享锁4、乐观锁&悲观锁5、自旋锁1、公平锁&非公平锁公平锁:按照申请锁的顺序分配锁,也就是先来先得,禁止插队。申请锁时,发现当前有其他线程在等待锁,那么当前线程原创 2021-02-13 23:38:11 · 411 阅读 · 0 评论 -
java8 Lock中Condition的await/signal原理详解
本文将介绍接口Condition的实现原理。Condition是在Lock中使用,可以通过调用Lock.newCondition()获得一个Condition对象。每个Condition对象都与一个Lock对象相关,调用Condition对象的方法前必须获得对应Lock对象的锁,Condition的作用与Object的wait()/notify()作用类似,调用Condition.await()可以阻塞当前线程,Condition.signal()/signalAll()可以唤醒其他阻塞线程。一、Con原创 2021-02-13 13:05:39 · 3202 阅读 · 1 评论 -
java8 FutureTask、Future、Callable、Runnable区别总结
文章目录一、Callable与Runnable的区别二、Future接口三、FutureTask详解1.构造方法2、run()3、get()4、cancel()一、Callable与Runnable的区别Callable和Runnable都是接口,而且都只有一个方法。它们都是用于多线程环境下。Runnable只有一个run方法,实现类在run方法中定义线程需要完成的任务,它作为Thread构造函数的入参,线程启动后执行run方法。Runnable的run方法没有返回值,所以如果需要线程返回值的话,Ru原创 2021-02-12 13:54:06 · 894 阅读 · 2 评论 -
java七大垃圾收集器区别汇总
七大垃圾收集器主要是Serial、ParNew、Parallel Scavenge、CMS、Serial Old、Parallel Old、G1,这些收集器都已经开始商用了,它们用于HotSpot。它们之间的关系如下图:图片来源于:《深入理解Java虚拟机 第3版》上图中的JDK9表示从JDK9开始,CMS和Serial、ParNew和Serial Old的组合官方不再支持。这七个垃圾收集器分别作用于不同的分代,如果两个收集器之间存在连线,就说明它们可以搭配使用。唯独G1收集器是可以原创 2021-02-05 07:51:57 · 913 阅读 · 2 评论 -
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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
java8 常用集合类汇总详解之Queue
Queue是队列的接口,其常用实现类有ArrayBlockingQueue、SynchronousQueue、PriorityQueue、LinkedBlockingDeque、DelayQueue、LinkedBlockingQueue、ConcurrentLinkedQueue、PriorityBlockingQueue、LinkedList、ArrayDeque、ConcurrentLinkedDeque。它们之间的关系如下:根据实现接口的不同,它们分成三大类:普通队列、双向队列、阻塞队列。一、原创 2021-01-23 22:28:42 · 629 阅读 · 0 评论 -
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 阅读 · 0 评论 -
java8 Stream之Spliterator
Spliterator是java8新增的接口,意思为分割器或者分离器,作用是遍历元素或者将数据源的数据分割成几个部分。Spliterator的实现类非常多,这也体现了该接口的重要性。下图Stream中比较重要的几个类的继承体系:绿框表示实现类,蓝框表示接口。因为Integer、Long、Double比较特殊且常用,所以单独提供了Spliterator的实现类,不过原理与类ArraySpliterator都是一样的。上图中Spliterator的直接实现类分为四个,主要原因是它们的数据源不同。原创 2021-01-21 23:25:02 · 1590 阅读 · 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 阅读 · 0 评论 -
java8 stream运行原理之顺序流原理详解
接下来将通过两篇文章介绍stream的原理,本文介绍顺序流,下篇文章介绍并行流。一、顺序流原理总述下图是Stream的继承结构:蓝框表示接口,灰框表示抽象类,绿框表示非抽象类。因为Integer、Double、Long比较常用且特殊,java8提供了专门的Stream类。不过这三个类的原理与ReferencePipeline是一样的,本文接下来就以ReferencePipeline为例做介绍。ReferencePipeline是最常用的流对象,一般使用的流对象都是该类。该类是抽象类,它有三个子类原创 2021-01-17 11:12:44 · 2428 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
Java8 Stream:实例详细介绍遍历、筛选、归约、分组、聚合操作
文章目录一、什么是Stream一、什么是StreamStream是java8新加的特性,它将数据看做一个流,数据从源流入,中间经过一些操作,最后流出,Stream就像一个管道一样,数据是流经管道中的水。流经Stream的这些数据来源可以是数组,集合,甚至是一个有返回值的方法。在Stream里面,数据经过的操作分为两种:中间操作:终端操作:...原创 2021-01-10 13:56:29 · 2362 阅读 · 0 评论 -
Java-网上关于MappedByteBuffer的一些传言
网络上介绍MappedByteBuffer的文章有很多,发现其中一些文章内容有出入,我想在本文中通过一下实验验证一下哪些是对的。本文使用的是JDK8。内存映射文件原理MappedByteBuffer简介关于内存释放问题MappedByteBuffer是一个抽象类,它有两个子类:DirectByteBuffer和DirectByteBufferR。下面来看一下什么时候释放内存空间。通过内存映射,减少了一次拷贝操作,加快的文件访问速度。原创 2020-12-17 23:29:02 · 1409 阅读 · 0 评论 -
java8之元空间(Metaspace)
java里面垃圾回收效果最差的是永久代,而且永久代溢出也是一个非常常见的问题,从java7开始,原来存储于永久代的数据就不断的被移到其他位置,有不少数据都移动到了堆区,比如字符串常量池挪到了堆区,在java8最终将永久代移除,另外新增了一个区,也就是元空间(Metaspace),元空间承接了部分永久代的数据。本文接下来介绍元空间。文章目录一、永久代二、元空间一、永久代永久代与元空间有千丝万缕的联系,首先来看一下永久代。永久代更规范的名字的叫做方法区,永久代是方法区的一种实现方式,方法区是java规范原创 2020-12-05 14:41:15 · 8937 阅读 · 1 评论 -
java8解惑之字符串常量池(实现原理、垃圾回收)
字符串常量池在java6之前位于永久代,永久代从名字上已经告诉我们这里垃圾回收效果很差,如果字符串常量池中含有大量的字符串,那么很容易造成永久代溢出。从java7开始,字符串常量池挪到了堆中,堆空间一般比较大,而且堆空间的回收效率很高,所以相对于在永久代,放到堆空间后,内存溢出的情况大大减少。本文接下来先通过代码观察一下常量池,然后介绍字符串常量池如何实现的。本文使用的是jdk8。本文目录一、代码实验二、字符串常量池实现原理一、代码实验这里主要使用String.intern方法,intern()方原创 2020-12-05 11:45:42 · 4244 阅读 · 7 评论