自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

吃透Java

关注移动互联网

原创 吃透Java并发二十二:并发集合之ConcurrentHashMap(2) 扩容

一、扩容的基本思路 JDK1.8中,ConcurrentHashMap最复杂的部分就是扩容/数据迁移,涉及多线程的合作和rehash。我们先来考虑下一般情况下,如何对一个Hash表进行扩容。 1、扩容思路 Hash表的扩容,一般都包含两个步骤: ①table数组的扩容 table数组的扩容,一般就...

2020-02-17 14:51:47

阅读数 23

评论数 0

原创 吃透Java并发二十一:并发集合之ConcurrentHashMap(1) 原理

一、ConcurrentHashMap类简介 ConcurrentHashMap是在JDK1.5时,J.U.C引入的一个同步集合工具类,顾名思义,这是一个线程安全的HashMap。不同版本的ConcurrentHashMap,内部实现机制千差万别,本节所有的讨论基于JDK1.8。 Concurre...

2020-02-16 21:31:31

阅读数 60

评论数 0

原创 吃透Java并发二十:线程池之Fork/Join框架(2)实现

一、引言 回顾一下,Fork/Join框架的核心实现类是ForkJoinPool线程池,其它核心组件包括:ForkJoinTask(任务)、ForkJoinWorkerThread(工作线程)、WorkQueue(任务队列)。 这一章,我们将深入F/J框架的实现细节,看看ForkJoinPool线...

2020-02-13 15:38:27

阅读数 17

评论数 0

原创 吃透Java并发十九:线程池之Fork/Join框架(1) 原理

一、引言 算法领域有一种基本思想叫做“分治”,所谓“分治”就是将一个难以直接解决的大问题,分割成一些规模较小的子问题,以便各个击破,分而治之。 比如:对于一个规模为N的问题,若该问题可以容易地解决,则直接解决;否则将其分解为K个规模较小的子问题,这些子问题互相独立且与原问题性质相同,递归地解这些子...

2020-02-12 21:18:14

阅读数 19

评论数 0

原创 吃透Java并发十八:线程池之Future

一、Future简介 Future主要作用就是异步地执行任务,并在需要的时候获取结果。我们知道,一般调用一个函数,需要等待函数执行完成,调用线程才会继续往下执行,如果是一些计算密集型任务,需要等待的时间可能就会比较长。而Future可以让调用方立即返回,然后它自己会在后面慢慢处理,此时调用者拿到的...

2020-02-08 16:07:09

阅读数 55

评论数 0

原创 吃透Java并发十七:线程池之ScheduledThreadPoolExecutor

一、ScheduledThreadPoolExecutor简介 我们曾经提到过一种可对任务进行延迟/周期性调度的执行器(Executor),这类Executor一般实现了ScheduledExecutorService这个接口。ScheduledExecutorService在普通执行器接口(Ex...

2020-02-07 13:11:52

阅读数 62

评论数 0

原创 吃透Java并发十六:线程池之ThreadPoolExecutor

一、ThreadPoolExecutor简介 ThreadPoolExecutor,它是J.U.C在JDK1.5时提供的一种实现了ExecutorService接口的执行器,或者说线程池。通过Executors工厂,用户可以创建自己需要的执行器对象。 ThreadPoolExecutor并没有自己...

2020-02-06 15:28:24

阅读数 45

评论数 0

原创 吃透Java并发十五:线程池框架

一、概述 executors框架是整个J.U.C包中类/接口关系最复杂的框架,真正理解executors框架的前提是理清楚各个模块之间的关系,高屋建瓴,从整体到局部才能透彻理解其中各个模块的功能和背后的设计思路。 Executors框架的整体结构如下: 二、核心接口 1、Executor Exe...

2020-02-04 18:00:55

阅读数 90

评论数 0

原创 吃透Java并发十四:locks之ReentrantReadWriteLock

一、ReentrantReadWriteLock类简介 ReentrantReadWriteLock类,顾名思义,是一种读写锁,它实现了ReadWriteLock接口,该类在内部实现了具体独占锁特点的写锁,以及具有共享锁特点的读锁,和ReentrantLock一样,ReentrantReadWri...

2020-02-03 19:07:03

阅读数 54

评论数 0

原创 吃透Java并发十三:locks之ReentrantLock

一、ReentrantLock类简介 ReentrantLock类,实现了Lock接口,是一种可重入的独占锁,它具有与使用 synchronized 相同的一些基本行为和语义,但功能更强大。ReentrantLock内部通过内部类实现了AQS框架(AbstractQueuedSynchronize...

2020-02-02 18:36:51

阅读数 140

评论数 0

原创 吃透Java并发十二:locks之AQS的Conditon功能

一、概述 本章将继续以ReentrantLock的调用为例,说明AbstractQueuedSynchronizer提供的Conditon等待功能。 J.U.C包提供了Conditon接口,用以对原生的Object.wait()、Object.notify()进行增强。 Condition接口的实...

2020-02-02 17:39:52

阅读数 40

评论数 0

原创 吃透Java并发十一:locks之AQS共享功能分析

一、概述 我们通过ReentrantLock的示例,分析了AQS的独占功能。本节将以CountDownLatch为例,分析AQS的共享功能。 CountDownLatch是一个辅助同步器类,用来作计数使用,它的作用有点类似于生活中的倒数计数器,先设定一个计数初始值,当计数降到0时,将会触发一些事件...

2020-01-31 21:51:10

阅读数 55

评论数 0

原创 吃透Java并发十:locks之AQS独占锁功能分析

一、独占锁代表ReentrantLock ReentrantLock类,实现了Lock接口,是一种可重入的独占锁,它具有与使用 synchronized 相同的一些基本行为和语义,但功能更强大。ReentrantLock内部通过内部类实现了AQS框架(AbstractQueuedSynchroni...

2020-01-29 21:20:52

阅读数 47

评论数 0

原创 吃透Java并发九:locks之AbstractQueuedSynchronizer(AQS)

AbstractQueuedSynchronizer抽象类(以下简称AQS)是整个java.util.concurrent包的核心。在JDK1.5时,Doug Lea引入了J.U.C包,该包中的大多数同步器都是基于AQS来构建的。AQS框架提供了一套通用的机制来管理同步状态(synchroniza...

2019-12-15 21:47:41

阅读数 158

评论数 3

原创 吃透Java并发八:locks之 Lock、ReadWriteLock、Condition接口

一、Lock接口 在JDK1.5之前,我们加锁只能通过synchronized关键字。在多线程情况下,一段代码被synchronized关键字修饰,那么同一时刻只能被一个线程访问,其它线程都必须等待该线程释放锁之后才有机会获取锁进入代码块。 持有synchronized锁的线程释放锁有如下两种情况...

2019-12-06 10:32:23

阅读数 170

评论数 0

原创 吃透Java并发七:locks框架

一、juc-locks框架整体分析 早期的JDK版本中,仅仅提供了synchronizd、wait、notify等等比较底层的多线程同步工具,开发人员如果需要开发复杂的多线程应用,通常需要基于JDK提供的这些基础工具进行封装,开发自己的工具类。 JDK1.5之后,Doug Lea设计了JUC并发包...

2019-12-03 20:29:21

阅读数 120

评论数 1

原创 吃透Java并发六:ThreadLocal

一、ThreadLocal简介 ThreadLocal 用一种存储变量与线程绑定的方式,在每个线程中用自己的 ThreadLocalMap 安全隔离变量,为解决多线程程序的并发问题提供了一种新的思路。ThreadLocal不是为了解决多线程访问共享变量,而是为每个线程创建一个单独的变量副本,提供了...

2019-11-30 20:52:43

阅读数 250

评论数 1

原创 吃透Java基础十五:强引用、软引用、弱引用、虚引用

前言 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。而对于如何描述一些“食之无味,弃之可惜”的对象就显得无能为力。我们希望能描述这样一类对象:当内存空间还足够时,则能保留在内存之中,如果内存在进行垃圾收集后还...

2019-11-28 21:13:33

阅读数 147

评论数 0

原创 吃透Java并发五:Java线程安全与锁优化

一、何为线程安全 当一个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方法进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。 按照线程安全的“安全程度”由强到弱来排序,我们可以将Java语言中各种操作...

2019-11-23 21:51:01

阅读数 134

评论数 1

原创 吃透Java并发四:Java内存模型

一、Java内存模型 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量是指:实例字段、静态字段和数组对象,但是不包括局部变量和方法参数,因为后者是线程私有的,不会被共享,自然不存在竞争的问题。 Java内存模型规定了...

2019-11-19 21:12:36

阅读数 155

评论数 1

原创 吃透Java并发三:线程的阻塞与唤醒

一、阻塞与唤醒 线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题。如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节。Java为我们提供了多种API来对线程进行阻塞和唤醒操作,比如sleep、suspend与r...

2019-11-15 16:53:28

阅读数 213

评论数 1

原创 吃透Java并发二:Thread线程用法

一、线程 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进程所创建的对象资源(内存资源)。 每个程序都至少拥有一个线程-即作为Java虚拟机(JVM)启动参数运行在主类main方法的线程。在Java虚拟机初始化过程中也可能启动其他的后台线程...

2019-11-14 20:59:26

阅读数 163

评论数 3

原创 吃透Java并发一:并发基础概念

一、并发与并行 并发:对于单CPU的计算机来说,在CPU中,同一时间只能干一件事儿的。为了看起来像是“同时干多件事”,分时操作系统把CPU的时间划分成长短基本相同的”时间片”,通过操作系统的管理,把这些时间片依次轮流地分配给各个用户使用。由于计算机的处理速度很快,只要时间片的间隔取得适当,那么一个...

2019-11-12 21:04:46

阅读数 195

评论数 1

原创 吃透Java基础十四:继承引发的“血案”

在Java中,只允许单继承,也就是说一个类只能继承一个父类,但是可以实现多个接口。本文我们讨论一下子类和父类的构造方法调用顺序、代码块执行顺序、方法的重写与重载。 一、构造方法调用顺序 1、何为构造方法 构造方法是类的一种特殊方法,用来初始化类的一个新的对象,每个类至少有一个构造方法,如果类中没有...

2019-11-10 16:40:48

阅读数 215

评论数 1

原创 吃透Java基础十三:String字符串

一、String基础 1、创建字符串方式 String test = “abc”; String test = new String(“abc”); 2、String类是不可变的 public final class String implements java.io.Serializ...

2019-11-09 21:45:58

阅读数 289

评论数 5

原创 吃透Java基础十二:IO

一、什么是IO流 Java中将输入输出抽象称为流,就好像水管,将两个容器连接起来。流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流。 按数据来源(去向)分类: 文件:FileInputStream、FileOutputStream、FileRead...

2019-11-08 18:41:50

阅读数 158

评论数 1

原创 吃透Java基础十一:枚举

一:初识枚举 枚举是JDK1.5添加的,在枚举类型出来之前,我们都是以定义常量来代替,比如: public class Date { public static final int ONE = 0; public static final int TWO = 1; publ...

2019-11-05 15:48:44

阅读数 389

评论数 2

原创 吃透Java基础十:注解

一、什么是注解 官方定义: 注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。 注解有许多用处,主要如下: 提供信息给编译器:编译器可以利用注解来探测错误和警告信息。 编译阶段时的处理:软件工具可以用来利用注解信息来生成代...

2019-11-03 13:38:39

阅读数 216

评论数 1

原创 吃透Java基础九:序列化

一:什么是序列化 序列化是将Java对象相关的类信息、属性、属性值等信息以一定的格式转换为字节流,反序列化时再将字节流表示的信息来构建出Java对象。过程中涉及到其它对象的引用对象也要参与序列化。 二:序列化的应用场景 永久性保存对象,保存对象的字节序列到本地文件或者数据库中。 通过序列化以字节...

2019-11-02 17:46:58

阅读数 2108

评论数 3

原创 吃透Java基础八:Throwable异常

一:关于异常 JAVA异常是在java程序运行的时候遇到非正常的情况而创建的对,它封装了异常信息。java异常的根类为java.lang.Throwable,整个类有两个直接子类java.lang.Error和java.lang.Exception。 Error是程序本身无法恢复的严重错误,一般是...

2019-11-01 17:51:28

阅读数 214

评论数 1

原创 吃透Java基础七:浅拷贝与深拷贝

一:什么是浅拷贝和深拷贝 浅拷贝:原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。也就是说:在浅拷贝中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用...

2019-10-29 20:30:29

阅读数 193

评论数 1

原创 吃透Java基础六:反射

一:什么是反射 Java 反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及方法的信息。反射还可以让我们在运行期实例化对象,调用方法,通过调用 get/set 方法获取变量的值。 很多人都认为反射在实际的 Java 开发应用中并不广泛,其实不...

2019-10-29 18:04:21

阅读数 218

评论数 1

原创 吃透Java基础五:Class类和Object类

在Java的世界里,一切皆是对象,所有的对象都是继承于Object类,而记录对象的类型的信息是由Class类来完成的,下面就让我们来具体了解一下Class类和Object类。 一:Class类 每个类的运行时的类型信息就是用Class对象表示的,它包含了与类有关的信息,其实我们的实例对象就通过Cl...

2019-10-27 18:13:41

阅读数 363

评论数 1

原创 吃透Java基础四:内部类

一、什么是内部类 内部类顾名思义就是在类的内部再定义一个类,内部类依赖于外部类而存在,内部类可以分为成员内部类、静态内部类、局部内部类、匿名内部类。 内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号 。 外部类的访问权限只能是public...

2019-10-25 17:39:33

阅读数 205

评论数 1

原创 吃透Java基础三:触发类初始化的五种方式

一:类的生命周期 类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用、卸载七个阶段,其中验证、准备、解析这三个阶段统称为链接。 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类加载过程必须按照这种顺序按部就班的开始。 二:类加载时机 ...

2019-10-23 16:57:33

阅读数 280

评论数 2

原创 吃透Java基础二:创建对象的五种方式

一:使用new关键字 这是最常见也是最简单的创建对象的方式了。通过这种方式,我们可以调用任意的构造函数(无参的和带参数的)。 public static void main(String[] args) { People people = new People(); } ...

2019-10-22 21:11:58

阅读数 362

评论数 1

原创 吃透Java集合系列十二:TreeMap

一:TreeMap整体认识 我们知道HashMap,它保证了以O(1)的时间复杂度进行增、删、改、查,从存储角度考虑,这两种数据结构是非常优秀的。但是HashMap还是有自己的局限性----它不具备统计性能,或者说它的统计性能时间复杂度并不是很好才更准确,所有的统计必须遍历所有Entry,因此时间...

2019-10-22 16:13:56

阅读数 179

评论数 0

原创 吃透Java集合系列十一:LinkedHashMap

概述 HashMap是Java集合中的重要成员,也是Map族中我们最为常用的一种,但是HashMap是无序的,也就是说,迭代HashMap所得到的元素顺序并不是它们最初放置到HashMap的顺序。 HashMap的这一缺点往往会造成诸多不便,因为在有些场景中,我们确需要用到一个可以保持插入顺序的M...

2019-10-20 16:03:52

阅读数 126

评论数 0

原创 吃透Java集合系列十:HashTable

一:整体实现 HashTable和HashMap实现大致相同,都是基于哈希表来实现的,数组+链表的形式(和HashMap有稍微的区别,HashMap加入了红黑树),它存储的内容是键值对(key-value)映射。 Hashtable 继承于Dictionary,实现了Map、Cloneable、...

2019-10-19 11:35:00

阅读数 275

评论数 0

原创 吃透Java集合系列九:HashMap

一:HashMap的整体实现 HashMap是由Hash表来实现的,数组+链表(1.8加入红黑树)的方式实现的,通过key的hash值与数组长度取余来获取应插入数组的下标,如果产生Hash冲突,在原下标位置转为链表,当链表长度到达8并且数组长度大于等于64则转为红黑树。 通过以上描述我们提以下...

2019-10-16 20:40:08

阅读数 149

评论数 0

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