- 博客(21)
- 收藏
- 关注
原创 2. 并发-共享模型之管程
3. 共享模型之管程什么是线程安全当多个线程访问某个方法时,不管你通过怎样的调用方式、或者说这些线程如何交替地执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类是线程安全的。3.1 共享带来的问题3.1.1 JAVA代码的体现两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗?static int counter = 0;public static void main(String[] args
2021-07-12 20:33:40
246
原创 Docker
1. 参考资料官方文档:https://docs.docker.com/docker-for-windows/仓库地址:https://hub.docker.com/2. Docker概述2.1 Docker为什么会出现一款产品,开发和上线两套环境,应用环境配置费时费力,而且容易出问题尤其对于机器学习和深度学习的库更是如此,很可能存在版本问题、底层依赖冲突问题所以发布项目时,不只是一套代码过去,而是代码+环境整体打包过去所谓开发即运维,保证系统稳定性,提高部署效率使用Docker后的流程:
2021-07-10 11:45:41
179
原创 并发-进程与线程
1. 进程与线程1.1 进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)线程一个进程之内可以分为一到多个
2021-07-10 11:42:31
269
原创 万字集合概述
1. 集合体系图下面所有的实现类都重写了toString方法1.1 单列集合1.2 双列集合存放的是K-V2.Collection方法因为Collection Set List都是接口不能直接实例化,所以我们选用ArrayList来演示各种方法2.1 添加操作2.2 删除操作2.3 查找2.4 获取元素个数list.size()2.5 判断为空list.isEmpty()2.6清空list.clear();2.7 遍历2.7.1 Iterator法It
2021-07-08 11:11:47
260
原创 Java-枚举类
1 枚举类的理解类的对象只有 有限个 确定的当需要定义一组常量时,强烈建议使用枚举类举例如下星期:Monday(星期一)、…、Sunday(星期天)性别:Man(男)、Woman(女)季节:Spring(春节)…Winter(冬天)支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)就职状态:Busy、Free、Vocation、Dimission订单状态:Nonpayment(未付款)、Paid(已
2021-07-08 11:09:48
89
原创 Java-反射
1. 反射快速入门re.propertiesclassfullpath=com.sls.CatmethodName=hiCat类public class Cat { private String name; public void hi(){ System.out.println("hello"); }}反射测试类public class demo01 { public static void main(String[] args) thr
2021-07-08 11:08:36
99
原创 万字泛型详解
1. 概述1.1 什么是泛型泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型 参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方
2021-07-08 10:56:55
162
原创 正则表达式
# 1. 入门案例提取文章中的所有英文单词import java.util.regex.Matcher;import java.util.regex.Pattern;public class Test1 { public static void main(String[] args) { String content="由于在开发Oak语言时,尚且不存在运行字节码的硬件平台,所以为了在开发时可以对这种语言进行实验研究,他们就在已有的硬件和软件平台基础上,按照自己所指定的规
2021-07-07 13:58:12
93
原创 Class文件解析
1. Class文件的介绍1.1 本质Class 文件是一组以一个字节为基础单位的二进制流。任何一个 Class 文件都对应着唯一一个类或接口的定义信息1.2 格式Class 文件格式采用一种类似于 C 语言结构体的方式进行数据存储,这种结构中只有两种数据类型:无符号数和表无符号数属于基本的数据类型,以 u1、u2、u4、u8 来分别代表 1 个字节、2 个字节、4 个字节、8 个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照 UTF-8 编码构成字符串值。表是由多
2021-07-03 11:14:20
1821
1
原创 类的加载过程
1. 概述在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义引用数据类型则需要进行类的加载。按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存为止,它的整个生命周期包括如下7个阶段:2. 类加载的过程加载,验证,准备和初始化和卸载这五个阶段的开始顺序是一定的,但是通常这些阶段都说互相交叉地混合进行的2.1 加载阶段2.1.1 目标通过一个类的全限定名来获取此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行
2021-07-03 11:08:15
469
原创 JVM第十二章-垃圾回收器
1. GC分类与性能指标垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。Java不同版本新特性语法层面:Lambda表达式、switch、自动拆箱装箱、enum、泛型API层面:Stream API、新的日期时间、Optional、String、集合框架底层优化:JVM优化、GC的变化、元空间、静态域、字符串常量
2021-06-27 12:38:17
141
原创 JVM第十一章-垃圾回收相关概念
1. System.gc() 的理解在默认情况下,通过System.gc()者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(不能确保立即生效)JVM实现者可以通过System.gc() 调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,**无须手动触发,否则就太过于麻烦了。**在一些特殊情况下,如我
2021-06-27 09:18:38
160
原创 JVM第十章-垃圾回收概述和相关算法
垃圾回收概述Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C++语言没有垃圾收集技术,需要程序员手动的收集。垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。关于垃圾收集有三个经典问题:哪些内存需要回收?什么时候回收?如何回收?垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的..
2021-06-27 09:17:57
171
原创 JVM第九章-StringTable
1. String的基本特性String:字符串,使用一对 “” 引起来表示使用“”的会被放到字符串常量池,new的不会放到字符串常量池String s1 = "atguigu" ; // 字面量的定义方式String s2 = new String("hello"); // new 对象的方式String被声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以
2021-06-27 09:17:14
209
原创 JVM第八章-执行引擎
1. 执行引擎概述1.1 概述执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一
2021-06-27 09:16:29
152
原创 JVM第七章-对象的实例化内存布局与访问定位
1. 对象的实例化大厂面试题美团:对象在JVM中是怎么存储的?对象头信息里面有哪些东西?蚂蚁金服:二面:java对象头里有什么1.1 对象创建的方式new:最常见的方式、单例类中调用getInstance的静态类方法,XXXFactory的静态方法Class的newInstance方法:在JDK9里面被标记为过时的方法,因为只能调用空参构造器,并且权限必须为 publicConstructor的newInstance(Xxxx):反射的方式,可以调用空参的,或者带参的构造器,权限
2021-06-27 09:15:40
113
原创 JVM第六章-方法区
1. 栈、堆、方法区的交互关系从线程共享与否的角度来看ThreadLocal:如何保证多个线程在并发环境下的安全性?典型场景就是数据库连接管理,以及会话管理。栈、堆、方法区的交互关系下面涉及了对象的访问定位Person 类的 .class 信息存放在方法区中person 变量存放在 Java 栈的局部变量表中真正的 person 对象存放在 Java 堆中在 person 对象中,有个指针指向方法区中的 person 类型数据,表明这个 person 对象是用方法区中的 Person 类
2021-06-27 09:13:48
103
原创 JVM第五章-堆
1. 堆的核心概述1.1 堆与进程一个java程序对应一个进程一个进程对应一个jvm实例一个jvm实例中只有一个运行时数据区一个运行时数据区只有一个方法区和堆一个进程中的多个线程需要共享同一个方法区,堆空间每一个线程拥有独立的一套程序计数器,虚拟机栈,本地方法栈堆针对一个JVM进程来说是唯一的。也就是一个进程只有一个JVM实例,一个JVM实例中就有一个运行时数据区,一个运行时数据区只有一个堆和一个方法区。但是进程包含多个线程,他们是共享同一堆空间的。一个JVM实例只存在
2021-06-23 17:28:44
154
原创 JVM第四章-虚拟机栈
1. 简介1.1 虚拟机栈的出现背景由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的【如果设计成基于寄存器的,耦合度高,性能会有所提升,因为可以对具体的CPU架构进行优化,但是跨平台性大大降低】。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。1.2 内存中的堆与栈首先栈是运行时的单位,而堆是存储的单位。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎
2021-06-23 15:13:34
127
原创 JVM第三章-运行时数据区
1. 运行时数据区概述及线程1.1 前言本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段当我们通过前面的:类的加载 --> 验证 --> 准备 --> 解析 --> 初始化,这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区类比一下也就是大厨做饭,我们把大厨后面的东西(切好的菜,刀,调料),比作是运行时数据区。而厨师可以类比于执行引擎,将通过准备的东西进行制作成精美的菜品。1.2 运行时数据区结构1.2
2021-06-23 15:12:23
105
原创 JVM第二章-类加载子系统
1. 内存结构概述1.1 简图1.2 详细图英文版中文版注意:方法区只有HotSpot虚拟机有,J9,JRockit都没有如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢?类加载器执行引擎2. 类加载子系统2.1 功能类加载器子系统作用:类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。加载
2021-06-23 15:09:59
129
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人