读书笔记
文章平均质量分 76
读书笔记
孤丨焰
萌新一枚
展开
-
【读书笔记】《深入理解Java虚拟机》对象的访问定位
建立对象就是为了使用对象,我们的 Java 程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式由虚拟机实现而定,目前主流的访问方式有①**使用句柄**和②**直接指针**两种:1. 句柄: 如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息;原创 2021-02-26 23:20:55 · 132 阅读 · 1 评论 -
【读书笔记】《深入理解Java虚拟机》对象的内存布局
在 Hotspot 虚拟机中,对象在内存中的布局可以分为 3 块区域:对象头、实例数据和对齐填充。 Hotspot 虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时数据(哈希码、GC 分代年龄、锁状态标志等等),另一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是那个类的实例。 实例数据部分是对象真正存储的有效信息,也是在程序中所定义的各种类型的字段内容。原创 2021-01-25 11:10:03 · 198 阅读 · 0 评论 -
【读书笔记】《深入理解Java虚拟机》类加载机制
在上一篇博文中介绍到了创建对象的5个步骤(①类加载、②分配内存、③初始化零值、④设置对象头、⑤执行<init>方法),其中便包括了类加载,这次我们来深入类加载机制,详细看看类如何被加载。原创 2021-01-18 09:26:31 · 179 阅读 · 0 评论 -
【读书笔记】《深入理解Java虚拟机》对象创建的五个步骤
在面试过程中,面试官在问Java内存区域相关问题的时候常常会问到Java创建对象的过程是什么(5个步骤)?此文为博主阅读《深入理解Java虚拟机》后的整理总结,如果喜欢此文的话希望小伙伴们多多支持。原创 2021-01-11 10:17:49 · 265 阅读 · 0 评论 -
JVM运行时数据区详解(13张图助你理解运行时数据区)
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。下图展示了Java虚拟机所管理的内存包括的运行时数据区域:原创 2020-12-27 15:13:45 · 2743 阅读 · 0 评论 -
【读书笔记】《深入理解Java虚拟机》Java虚拟机发展史
Java虚拟机发展史1.Sun Classic VM2.Exact VM3.HotSpot VM4.JRockit VM5.J9 VM1.Sun Classic VM 早在1996Java1.0版本的时候,Sun公司发布了一款名为Sun Classic VM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,JDK1.4时完全被淘汰。 这款虚拟机内部只提供解释器。(解释器是一行一行执行代码,编译器是将字节码中的热点代码编译成机器码,并且将机器码缓存到方法区的代码缓存区) 解释器和编译器工作原创 2020-12-15 20:44:28 · 293 阅读 · 0 评论 -
【读书笔记】《大话设计模式》代理模式
1.什么是代理模式 代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。 举个例子来说明:假如说我现在想买一辆二手车,虽然我可以自己去找车源,做质量检测等一系列的车辆过户流程,但是这确实太浪费我得时间和精力了。我只是想买一辆车而已为什么我还要额外做这么多事呢?于是我就通过中介公司来买车,他们来给我找车源,帮我办理车辆过户流程,我只是负责选择自己喜欢的车,然后付钱就可以了。用图表示如下:2.代理模式的特点中介隔离作用:在某些情况下,一个原创 2020-10-22 22:12:08 · 209 阅读 · 4 评论 -
【读书笔记】《大话设计模式》单例模式
1.什么是单例模式2.单例模式的特点3.UML图4.单例模式具体实现5.单例模式应用场景原创 2020-10-19 10:33:26 · 215 阅读 · 0 评论 -
【读书笔记】《大话设计模式》抽象工厂模式
1.什么是抽象工厂方法模式?2.抽象工厂方法模式的作用?3.UML图4.抽象工厂方法模式实现5.反射原创 2020-10-06 15:56:48 · 228 阅读 · 0 评论 -
【读书笔记】《大话设计模式》工厂方法模式
1.什么是工厂方法模式? 工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。2.工厂方法模式的作用? 工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。3.UML图4.工厂方法模式实现5.简单工厂vs工厂方法...原创 2020-10-04 21:10:34 · 201 阅读 · 0 评论 -
【读书笔记】《大话设计模式》简单工厂模式
1 工厂模式简介1.1 定义 简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。 简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。1.2 简单工厂模式结构图Factory:工厂类,简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。IProduct:抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共转载 2020-09-24 22:43:21 · 195 阅读 · 0 评论 -
【读书笔记】《Java并发编程的艺术》Java内存模型——happens-before
一、JMM的设计从JMM设计者的角度,在设计JMM时,需要考虑两个关键因素:程序员对内存模型的使用。程序员希望内存模型易于理解、易于编程。程序员希望基于一个强内存模型来编写代码。编译器和处理器对内存模型的实现。编译器和处理器希望内存模型对它们的束缚越少越好,这样它们就可以做尽可能多的优化来提高性能。编译器和处理器希望实现一个弱内存模型。由于这两个因素互相矛盾,所以JSR-133专家组在设计JMM时的核心目标就是找到一个好的平衡点:一方面,要为程序员提供足够强的内存可见性保证;另一方面,对编译器和原创 2020-08-30 11:50:36 · 161 阅读 · 0 评论 -
【读书笔记】《Java并发编程的艺术》Java内存模型——final域的内存语义
一、final域的重排序规则原创 2020-08-28 21:39:40 · 237 阅读 · 0 评论 -
【读书笔记】《Java并发编程的艺术》Java内存模型——锁的内存语义
锁的释放-获取建立的happens-before关系原创 2020-08-28 14:11:03 · 126 阅读 · 0 评论 -
【读书笔记】《Java并发编程的艺术》Java内存模型——volatile的内存语义
一、volatile的特性理解volatile特性的一个好方法是把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。下面通过具体的示例来说明,示例代码如下:class VolatileFeaturesExample { volatile long vl = 0L; // 使用volatile声明64位的long型变量 public void set(long l) { vl = l; // 单个volatile变量的写 } public void原创 2020-08-27 20:58:52 · 190 阅读 · 0 评论 -
【读书笔记】《Java并发编程的艺术》Java内存模型——顺序一致性
顺序一致性内存模型是一个理论参考模型,在设计的时候,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参照。一、数据竞争与顺序一致性当程序未正确同步时,就可能会存在数据竞争。Java内存模型规范对数据竞争的定义如下:在一个线程中写一个变量,在另一个线程读同一个变量,而且写和读没有通过同步来排序。JMM对正确同步的多线程程序的内存一致性做了如下保证:如果程序是正确同步的,程序的执行将具有顺序一致性(Sequentially Consistent)——即程序的执行结果与该程序原创 2020-08-27 13:48:53 · 228 阅读 · 0 评论 -
【读书笔记】《Java并发编程的艺术》Java内存模型——重排序
一、数据依赖性原创 2020-08-26 19:17:03 · 160 阅读 · 0 评论 -
【读书笔记】《Java并发编程的艺术》Java内存模型——Java内存模型的基础
一、并发编程模型的两个关键问题在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 共享内存的并发模型:线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。但是,同步是显式进行的,程序员必须显式指定某个方法或某段代码需要在线程之间互斥执行。 消息传递的并发模型:线程之间没有公共状态,线程之间必须通过发送消息来显式原创 2020-08-25 13:33:58 · 173 阅读 · 0 评论 -
【读书笔记】《Java并发编程实战》第十五章 原子变量与非阻塞同步机制
原子变量与非阻塞同步机制知识梳理原创 2020-08-24 20:34:05 · 360 阅读 · 0 评论 -
【读书笔记】《Java并发编程实战》第十四章 构建自定义的同步工具——AQS介绍
AbstractQueuedSynchronizer知识梳理1.AbstractQueuedSynchronizer1.AbstractQueuedSynchronizer在基于AQS构建的同步器类中,最基本的操作包括各种形式的获取操作和释放操作。获取操作是一种依赖状态的操作,并且通常会阻塞。释放操作并不是一个可阻塞的操作,当执行释放操作时,所有在请求时被阻塞的线程都会开始执行。AQS负责管理同步器类中的状态,它管理了一个整数状态信息,可以通过getState、setState以及compareAnd原创 2020-08-24 13:10:31 · 220 阅读 · 0 评论 -
【读书笔记】《Java并发编程实战》第十三章 显式锁
显示锁知识梳理原创 2020-08-17 13:38:08 · 668 阅读 · 0 评论 -
【读书笔记】《Java并发编程实战》第十一章 性能与可伸缩性
性能与可伸缩性知识梳理1.对性能的思考1.对性能的思考原创 2020-08-13 16:10:28 · 665 阅读 · 0 评论 -
【读书笔记】《Java并发编程实战》第十章 活跃性危险
活跃性危险知识梳理1.死锁1.1锁顺序死锁1.2动态的锁顺序死锁1.死锁我们使用加锁机制来确保线程安全,但如果过度地使用加锁,则可能导致锁顺序死锁。同样,我们使用线程池和信号量来限制对资源的使用,但这些被限制的行为可能会导致资源死锁。当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么它们将永远被阻塞。在线程A持有锁L并想获得锁M的同时,线程B持有锁M并尝试获得锁L,那么这种情况就是简单的死锁形式。(其中多个线程由于存在环路的锁依赖关系而永远地等待下去。)死锁形式如下图所示:1.1锁原创 2020-08-10 13:47:54 · 303 阅读 · 0 评论 -
【读书笔记】《Java并发编程实战》第八章 线程池的使用
线程池知识梳理1.线程饥饿死锁2.设置线程池的大小1.线程饥饿死锁在线程池中,如果任务依赖于其他任务,那么可能导致死锁。在单线程的Executor中,第二个任务停留在工作队列中,等待第一个任务的完成,之后到第二个任务开始执行,而第一个任务又需要第二个任务完成的结果,因此这样就导致死锁。只要线程池中的任务需要无限期地等待一些必须由池中其它任务才能提供的资源或条件,例如某个任务等待另一个任务的返回值或执行结果,除非线程池足够大,否则将发生线程饥饿死锁。例如://在单线程Executor中任务发生死锁(不要原创 2020-08-05 21:12:05 · 274 阅读 · 0 评论 -
【读书笔记】《Java并发编程实战》第七章 取消与关闭
任务取消与JVM关闭知识梳理任务取消1.什么是任务取消?2.取消任务的方式有几种?2.1设置取消标志2.2中断任务取消1.什么是任务取消?如果外部代码能在某个操作正常完成之前将其置入“完成状态”,那么这个操作就可以成为可取消的。取消某个操作的原因可能有:用户请求取消有时间限制的操作触发应用程序事件发生错误程序或任务关闭2.取消任务的方式有几种?取消任务的方式大体上有一下两种:设置取消标志中断2.1设置取消标志可以在程序中设置某个用于判断任务是否已取消的标志位,然后定期查原创 2020-08-01 13:32:23 · 511 阅读 · 0 评论 -
【读书笔记】《Java并发编程实战》第六章 Executor框架
Executor框架知识梳理Executor框架一、什么是Executor框架?二、Executor框架结构详解Executor框架一、什么是Executor框架?为了把工作单元与执行机制分离开,Executor框架诞生了,他是一个用于统一创建与运行的接口。Executor框架实现的就是线程池的功能。首先,我们先介绍Executor接口,如下示例://Executor接口public interface Executor { void execute(Runnable command);}原创 2020-07-27 00:29:04 · 342 阅读 · 0 评论 -
【读书笔记】《Java并发编程实战》第五章 同步容器类与并发容器类
基础构建模块知识梳理同步容器类同步容器类原创 2020-07-22 15:07:49 · 478 阅读 · 0 评论 -
【读书笔记】《Java并发编程实战》第四章 对象的组合
对象的组合知识梳理设计线程安全的类1.找出构成对象状态的所有变量2.找出约束状态变量的不变性条件3. 建立对象状态的并发访问管理策略实例封闭线程安全性委托拓展线程安全的类设计线程安全的类要确保类的线程安全性,就需要确保它的不变性条件不会再并发访问的情况下被破坏。在设计线程安全类的过程中,需要满足以下三个基本要素:找出构成对象状态的所有变量找出约束状态变量的不变性条件建立对象状态的并发访问管理策略概念介绍:同步策略:定义了如何在不违背对象不变条件或后验条件的情况下对其状态的访问操作进行原创 2020-07-17 15:23:05 · 523 阅读 · 1 评论 -
【读书笔记】《Java并发编程实战》第三章 对象的共享
对象的共享知识梳理可见性失效数据非原子的64位操作Volatile变量发布与逸出线程封闭ThreadLocal类不变性安全发布可见性 在多线程编程中,通常,我们无法确保读操作的线程能实时的看到其他线程写入的值。 为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。 并发编程过程中可能会发生“重排序”等问题,如例1。//例1public class NoVisibility { private static boolean ready; private static int numb原创 2020-07-09 19:38:46 · 373 阅读 · 0 评论 -
【读书笔记】《Java并发编程实战》第二章 线程安全性
线程安全性知识梳理线程安全性竞态条件数据竞争与竞态条件勿混淆复合操作加锁机制内置锁重入用锁来保护状态活跃性与性能线程安全性要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的和可变的状态的访问管理。竞态条件当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。最常见的竞态条件就是“先检查后执行”操作,另一种竞态条件是“读取-修改-写入”。数据竞争与竞态条件勿混淆数据竞争是指,如果在访问共享的非final类型的域时没有采用同步来进行协同,那么就会出现数据竞争。原创 2020-07-08 17:01:36 · 440 阅读 · 0 评论