java进阶学习笔记
文章平均质量分 53
java常见的难点知识,线程,容器,jvm,流,反射等和相对深入的知识记录。
且_听_风_吟
2018年至今java后端,spring boot 、cloud项目设计管理,微服务开发模式下的高并发和分布式整体架构研究。
2015-2017年主要做传统java web ssh服务,传统的集群、分布式架构设计。
了解前端、安卓开发;
展开
-
java进阶笔记之Files文件工具类
简介Files 是JDK1.7 之后系统封装的对文件操作的工具类 .示例源码简析ps: 直接调用FileSystemProvider方法实现的简单逻辑将不再注释 , 可以查看上篇: java进阶笔记之FileSystemProvider .重要方法walkFileTree遍历整个文件/文件夹树. 如果读取属性时发生IO异常则调用FileVisitor#visitFileFailed方法.ps: 默认实现是SimpleFileVisitor , 直接抛出异常. 也可以自定义实现,一般是原创 2021-01-20 16:03:12 · 411 阅读 · 0 评论 -
java进阶笔记之Channel与AbstractInterruptibleChannel
简介什么是ChannelChannel = 通道 = 承上启下的I / O操作入口 , 即连接点对点的输入输出操作入口。通道表示一个打开的到一个实体的连接,如一个硬件设备,文件,网络套接字,或者能够执行一个或多个不同的I / O操作,例如读或写的程序组件。通道要么打开要么关闭。 通道是在创建开放的,一旦关闭则永久关闭。 一旦通道被关闭时,任何试图调用I / O的操作,都抛出 ClosedChannelException.Channel 和 Stream 不同Stream 是单向数据流 ,原创 2020-07-22 15:05:29 · 564 阅读 · 0 评论 -
java进阶笔记之FileSystemProvider
简介文件相关的操作最终通过 java.nio.file.spi.FileSystemProvider 来提供 ,其不同的底层系统有不同的实现. 此类主要定义了如何在其对应的文件系统定位和加载文件 , 以及文件中常见的删除 / 拷贝等操作 .子孙类: AbstractFileSystemProvider / WindowsFileSystemProvider / JarFileSystemProvider / ZipFileSystemProvider示例import com.alibaba.fas原创 2020-06-27 15:15:10 · 2644 阅读 · 0 评论 -
java进阶笔记之Paths与FileSystems
简介Paths中封装了活动Path的工具方法 , 其实现默认依赖于FileSystems , 是Path操作的增强工具类.使用Paths时会使用FileSystem默认的文件分隔符操作.ps: 在win 系统中 同样支持 " / " 文件分隔符 .FileSystems FileSystem的工厂类, 主要是提供了系统常用的文件系统的快捷方法, 并且支持加载自定义的文件系统.示例import org.junit.Test; import java.io.IOException;i原创 2020-06-24 09:15:17 · 2459 阅读 · 0 评论 -
java进阶笔记之Path
背景Path 是jdk1.7 推出的专用于访问文件的一种路径抽象.位于包 java.nio.file .public interface Path extends Comparable<Path>, Iterable<Path>, Watchable一种可用于在文件系统中定位文件的对象。它通常表示一个系统相关的文件路径。path 可以表示一个根、一个根和一系列名称,或者仅仅是一个或多个名称元素。使用空路径访问文件相当于访问文件系统的默认目录这个接原创 2020-06-15 21:28:26 · 318 阅读 · 0 评论 -
java进阶笔记之URI与URL.md
简介URL 和URI无物理上的直接联系( 不是继承和实现 ).URL = Universal Resource Locator = 统一资定位符 ( jdk1.0出现)通过网络来定位和访问某资源的标识符.网络资源位置通常包括用于访问服务器的协议(如http、ftp等)、服务器的主机名或者IP地址、以及资源文件在该服务器上的路径。可以定位和访问比如文件 , 数据 等.URL的语法表示形式为:protocol://userInfo@host:port/path?query#原创 2020-06-11 14:10:09 · 677 阅读 · 1 评论 -
java进阶笔记线程与并发之高性能随机数ThreadLocalRandom
简介java的随机数均根据seed生成,而新的seed由老的seed生成。java.util.Random 线程安全,但是在高并发情况下,需要对seed做同步处理,所以冲突越高,性能越低。ThreadLocalRandom 在多线程冲突时,具有更高的随机数产生性能。基本原理是运行时将seed放到(当前)Thread的变量: threadLocalRandomSeed 中,然后独立维...原创 2020-04-09 18:11:23 · 1531 阅读 · 0 评论 -
java进阶笔记线程与并发之StampedLock
简介StampedLock 是ReadWriteLock的一种实现,不支持重入(容易死锁),适用于读多写少的场景。StampedLock 在读取的节点是并发唤醒的,在读取上的性能理论上更高。一旦读写操作在1:1甚至以上,则synchronized的性能将更高,ReentrantReadWriteLock的性能急剧下降,StampedLock 性能缓慢下降。一般推荐使用synchr...原创 2020-04-08 17:59:35 · 173 阅读 · 0 评论 -
java进阶笔记线程与并发之ExecutorCompletionService
简介ExecutorCompletionService类是CompletionService接口的实现,ExecutorCompletionService内部管理者一个已完成任务的阻塞队列(可以自定义),ExecutorCompletionService引用了一个Executor, 用来执行任务submit()方法最终会委托给内部的executor去执行任务take/poll方法...原创 2020-04-06 17:01:55 · 356 阅读 · 0 评论 -
java 进阶笔记线程与并发之线程计数与同步工具
简介常见的线程计数和信息同步工具如下:CountDownLatch(一次性栅栏)、Semaphore(信号量)、CyclicBarrier(循环同步栅栏)、Exchanger(线程间交换器)和Phaser(灵活可重用同步栅栏)。示例import org.junit.Test; import java.util.concurrent.*;import java.util.concurr...原创 2020-04-05 22:42:19 · 305 阅读 · 0 评论 -
java进阶笔记线程与并发之CompletableFuture.md
java进阶笔记线程与并发之CompletableFuture.md简介CompletableFuture 源码简析allOf / anyOfthenAcceptXXX、acceptXXXwhenCompleteXXXxxxComposehandleGET、join思考参考简介什么是CompletableFutureCompletableFuture类实现了CompletionStag...原创 2020-04-05 22:36:38 · 238 阅读 · 0 评论 -
java进阶笔记线程与并发之CountedCompleter
说明CountedCompleter是ForkJoinTask的一个子类。其可以简单理解为处理业务和数量有关的一些FJT,一般分为如下几类:和数量无关,一般不使用CountedCompleter一个: findAny、searchFirst这种操作,只要在集合、流中找到一个就表示整个任务完成的指定数量的: 比如有的业务需要触发多次完成的。可能需要有序完成的,有序完成可以通过Count...原创 2019-10-21 22:11:48 · 2585 阅读 · 0 评论 -
java 进阶笔记线程与并发之Future简析
简介Future表示异步计算的结果。方法用于检查计算是否完成,等待计算完成,并检索计算结果。只有当计算完成时,才能使用get方法检索结果,如果需要,可以阻塞它,直到它准备好为止。取消由取消方法执行。还提供了其他方法来确定任务是正常完成还是被取消。一旦计算完成,就不能取消计算。如果为了可取消而不提供可用的结果,可以声明Future作为底层任务的结果返回null。说明Future<V>...原创 2019-10-21 21:55:19 · 193 阅读 · 0 评论 -
java 进阶笔记线程与并发之AbstractExecutorService
简介一个正常的submit、invokeAny 和 invokeAll 方法的通用实现。源码简析RunnableFuture/** * 成功执行run(),才会使Future完成,并得到它的结果。 * @see FutureTask * @see Executor * @since 1.6 * @author Doug Lea * @param <V> The re...原创 2019-10-21 21:53:07 · 169 阅读 · 0 评论 -
java 进阶笔记线程与并发之ForkJoinPool简析
简介ForkJoinPool是一个线程池,支持特有的的ForkJoinTask,对于ForkJoinTask任务,通过特定的for与join方法可以优化调度策略,提高效率。使用通常,我们继承使用ForkJoinTask任务的子类:RecursiveAction:用于没有返回结果的任务。RecursiveTask :用于有返回结果的任务。通过,在子任务类的compute()中,我们将...原创 2019-10-21 21:49:22 · 2184 阅读 · 2 评论 -
java进阶之Condition接口
简介Condition Condition 是java5加入的,全限定名 java.util.concurrent.locks.Condition,是一个接口,主要功能是配合Lock是使用,实现对象监视器的功能。Condition 其作用和Object中的wait、notify 和 notifyAll 类似(Object中的这些方法需要配合synchronized使用)。大致功能如下:Con...原创 2019-07-07 08:58:48 · 143 阅读 · 0 评论 -
java进阶之Lock与ReentrantLock
简介Lock与ReentrantLock都是java.util.concurrent.locks包中常用的接口和类。其中ReentrantLock是Lock最常见的一个实现类。LockLock是一个接口:public interface Lock { //获取锁,会'休眠'到当前线程成功获取 void lock(); /** * 获取锁,和lo...原创 2019-06-07 16:10:48 · 301 阅读 · 0 评论 -
java进阶笔记之线程池
前言对于线程池,网上的资料非常的多,本文不准备重复介绍和说明,而仅仅对重点和注意事项说明。线程池中一些概念说明线程的创建、销毁都是需要消耗系统资源的,而线程池可以复用池中的线程,所以可能大幅减少这两个步奏带来的资源开销,从而提高效率。逻辑任务提交时,判断的顺序为 corePoolSize –> workQueue –> maximumPoolSiz配置说明workQueu...原创 2019-06-02 10:18:41 · 133 阅读 · 0 评论 -
java进阶笔记之多线程:Thread类
简介java中的线程是jvm中虚拟的一个进程中的多个执行序列,线程执行并不一定是并行执行,可能是均分cpu的时间块来在执行各个线程的代码,由于时间块足够小,所以表现为多个线程在“同时”运行。线程状态每个线程都有自己的运行状态。新建状态用new关键字和Thread类或其子类新建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪...原创 2019-03-24 17:49:58 · 147 阅读 · 0 评论 -
java进阶笔记之volatile和atomic原子操作
前言概念简介简称全称说明CASCompare and Swap比较并交换JUCjava.util.concurrentjava的一个类包,主要用于并发控制概念说明在现代计算机的cpu中,cpu对数据的读写取分为两个步奏,第一步:cpu从cpu自带的高速缓存(可能有L1、L2甚至L3等多级高速缓存)中查询对象,如果找到即使用。第二步:如果第一步中c...原创 2019-03-24 15:55:08 · 819 阅读 · 0 评论 -
java进阶笔记之枚举Enum
简介java.lang.Enum类是从jdk1.5开始诞生的。枚举的的equals方法被重写为==方法,因为枚举实际上是"线程安全的单例模式"。Enum是所有枚举类型的基类,当我们新建一个枚举类的时候,默认会继承Enum类。Enum源码简析Enum的构造方法是protected的,并且我们无法直接调用,但是编译器会做出相关的响应。public abstract class Enum&l...原创 2018-11-09 22:26:53 · 200 阅读 · 0 评论 -
java进阶之LockSupport
简介LockSupport是java.util.concurrent.locks包下的类,功能是对线程进行阻塞和唤醒。 LockSupport中以park开头的方法来阻塞当前线程,unpark来唤醒被阻塞的线程。 和传统的wait/notify机制不同的是,wait/notify是对当前线程阻塞和唤醒一个线程(而不能具体指定); 而LockSupport阻塞当前对象,但是唤醒时却可以唤醒...原创 2018-05-14 17:34:59 · 266 阅读 · 0 评论 -
java进阶之unsafe与CAS操作简介
简介UnsafeUnsafe类属于在sun.misc包下,不属于Java标准包。 但是很多Java的基础类库,比如Netty、Cassandra、Hadoop、Kafka等都使用此类。 Unsafe类因为是native方法,直接调用底层,所以效率很高,在增强Java语言底层操 作能力方面起了很大的作用。当然,因为其直接操作内存,有点不受JVM管束,所以 官方建议除了JAVA自带...原创 2018-05-07 11:34:23 · 1916 阅读 · 0 评论 -
java进阶笔记之数组分析
java中的数组是什么?在我看来,java中的数组可以理解为是一个没有物理class类, 但是可实例化对象且有自己类型的一个对象,并且是Object的子类。或者说java中的数组除了没有对应的class文件和不可继承外,和别的java对象并无区别.注意:C语言中数组名确实代表数组首元素的地址。但java中数组都是对象,数组名就代表这个数组对象,而不是它的首地址。所以pri...原创 2018-05-04 10:51:28 · 228 阅读 · 0 评论 -
java进阶笔记之Set(HashSet和TreeSet和LinkedHashSet等)
简介java的set用于存放值不重复的对象,其结构如图。 Set接口继承自Collection接口,而SortedSet接口继承自Set。AbstractSet是一个抽象类。 Set主要有两种实现HashSet和TreeSet、LinkedHashSet。AbstractSetpublic abstract class AbstractSet<E> exte...原创 2018-05-16 15:23:03 · 229 阅读 · 0 评论 -
java进阶笔记之常用(通用)Map(Hash,Tree,Linked,Properties等)
简介Map是将键映射到值( key-value )的对象。 一个映射不能包含重复的键;每个键最多只能映射到一个值。 Map 接口提供三种collection 视图,允许以键集(keySet())、值集(values())或 键-值映射关系集(entrySet())的形式查看某个映射的内容( 即获取键值对的内容 )。映射顺序定义为迭代器在映射的 collection 视图上返回其元素的...原创 2018-05-03 17:03:28 · 741 阅读 · 0 评论 -
java进阶笔记之Queue队列分析
Queue简介Queue是一种线性的数据(队列)结构,其一般只允许在队列数据的前端(front,也称为头部head)和 数据的后端(rear,也称为尾部tail)进行数据操作。Queue队列一般存在FIFO和LIFO两种:FIFO 最先插入的元素将是最先被删除的元素; 反之最后插入的元素将是最后被删除的元素; FIFO(FIFO—first in first out)队列一般...原创 2018-05-02 14:40:48 · 366 阅读 · 0 评论 -
java进阶笔记之List
简介java的List类是一个接口,其继承自Collection接口。 List中的元素是有序的,且是可重复的。 List中只能存放引用类型。 而常用的有实现有:ArrayList 线程不安全,底层是数组实现,查改快,增删慢。 默认容量10. 扩容机制:当 ArrayList 的元素个数小于 6 时,容量达到最大时,元素容量会扩增至 12;当 ArrayList 的元素...原创 2018-04-24 17:35:54 · 197 阅读 · 0 评论 -
java进阶笔记之字符串String,StringBuilder,StringBuffer区别和分析
简介String,StringBuilder,StringBuffer都是CharSequence(接口)的实现。 ,而,StringBuffer继承了AbstractStringBuilder, 而AbstractStringBuilder直接实现了CharSequence接口。CharSequence CharSequence是一个接口,定义了length(), charA...原创 2018-04-27 09:13:34 · 288 阅读 · 0 评论 -
java进阶笔记之装箱(boxing)和拆箱(unboxing)操作
简介简而言之装箱就是将基本数据类型转换为包装器类型;拆箱就是将包装器类型转换为基本数据类型。 在jdk1.5之前需要手动完成装箱和拆箱的操作。而在其之后,则能够自动完成拆箱和装箱 (Autoboxing and unboxing)。类型对照java中的基础数据类型和对应包装类型的对照表 基础类型 包装类型 基础类型暂用的内存大小(字节) int ...原创 2018-04-20 17:51:20 · 2504 阅读 · 0 评论 -
java进阶笔记之java语言类层次结构概览
简介本文主要简介java语言中常用类/接口/jvm的结构。 注意:不同java版本的结构可能有不同常用java包java中常用的几个包介绍: 包名 说明 java.lang 该包提供了Java编程的基础类,例如 Object、Math、String、StringBuffer、System、Thread等,不使用该包就很难编写Java代码了。 ...原创 2018-04-20 17:59:50 · 800 阅读 · 1 评论 -
java 进阶笔记线程与并发之Executor、ExecutorService简析
简介Executor和ExecutorService都是接口,他们主要完成一个工作:执行和管理任务。即任务怎么运行、运行的结果、运行的统一启动与停止等等的管理。在java中,一个任务在同步时通常是一个方法,一个逻辑片段。但是更多情况,指的是异步执行的一段数据和逻辑。通常,我们将之封装为Thread,然后运行。但是这样有一个缺点:即任务的执行、管理 和 任务的定义耦合了在一起。Execu...原创 2019-08-31 17:09:31 · 232 阅读 · 0 评论 -
java AbstractOwnableSynchronizer与AbstractQueuedSynchronizer简析
AbstractQueuedSynchronizer(ASQ)提供了实现阻塞锁和依赖于FIFO等待队列和同步器(如信号量,事件等)相关的框架。同步队列节点分为独占节点和共享节点,等待队列使用相同的Node类,但是用不同的链接,唤醒后进入同步队列。同步队列中的节点自旋进入head,并根据前置节点状态决定是否阻塞以减少消耗。原创 2019-08-27 17:21:42 · 533 阅读 · 0 评论 -
java进阶之synchronized学习
每一个java对象都拥有自己的监视器monitor,当其中某个代码或者自身被synchronized修饰后访问此内容的时候都必须先获得此对象的监视器,如果成功则执行具体逻辑;否则改线程进入Blocked状态,当监视器被占有者释放后,在同步队列中的线程就会有机会重新获取该监视器。原创 2019-08-27 17:31:28 · 132 阅读 · 0 评论