Java
文章平均质量分 86
Java
Introncheng
这个作者很懒,什么都没留下…
展开
-
JVM层级的内存屏障:JSR内存屏障
JSR内存屏障:LoadLoad:对于这样的语句Load1;LoadLoad;Load2,在Load2及后续的读操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕;StoreStore:对于这样的语句Store1;StoreStore;Store2,在Store2及后续的写操作执行前,保证Store1的写入操作对其他处理器可见;LoadStore:对于这样的语句Load1;LoadStore;Store2,在Store2及后续的写入操作被刷出前,保证Load1要读取的数据被读取完毕;S原创 2020-05-15 16:37:25 · 731 阅读 · 0 评论 -
存储器层次结构、Cache Line、伪共享、Cache Line对齐
存储器的层次结构: 存储器是分层次的,离CPU越近的存储器,速度越快,每字节的成本越高,同时容量也越小。寄存器速度最快,离CPU最近,成本最高,所以个数容量有限,其次是高速缓存(缓存也是分级,有L1,L2,L3等缓存),再次是主存(普通内存),然后是本地磁盘,最次是远程文件存储。存储器层次结构缓存RegisterL1 cacheL2 cacheL3 cacheMain Memory硬盘访问时间< 1ns约1ns约3ns约15ns约80ns约2ms原创 2020-05-14 23:37:57 · 907 阅读 · 1 评论 -
Spring配置元数据的三种方式
1、基于XML文件的配置: 传统上,配置元数据以简单直观的XML格式提供,如下beans.xml文件中所示:id是标识单个bean定义的字符串,class定义bean的类型,并使用完全限定的类名,可以选择是否配置属性值。<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframewor...原创 2020-05-02 11:24:20 · 3367 阅读 · 0 评论 -
Java自定义类加载器(Tomcat类加载器)
自定义类加载器: 因为系统的ClassLoader只会加载指定目录下的class文件,如果你想加载自己的class文件,那么就可以自定义一个ClassLoader。而且我们可以根据自己的需求,对class文件进行加密和解密,自定义类加载器步骤如下:继承抽象类ClassLoader;重写findclass(String name)方法;调用defineClass(String name,...原创 2020-04-26 16:51:31 · 389 阅读 · 0 评论 -
Java类加载机制(类加载器、双亲委派)
类加载的时机创建类的实例:new、反射、反序列化、clone;访问类中的某个静态变量,或者对静态变量进行赋值;主动调用类的静态方法;ClassForName(“包类名”),得到的class已经初始化完成,ClassLoader.loadClass(“包类名”)得到的class是还没有链接(验证,准备,解析)的;完成子类的初始化,也会完成对本类的初始化(接口除外);该类是程序引导入口(...原创 2020-04-26 16:45:17 · 206 阅读 · 0 评论 -
使用JDOM读取XML文件
books.xml:<?xml version="1.0" encoding="utf-8" ?><books> <book id="001"> <title>Harry Potter</title> <author>J K. Rowling</author> ...原创 2020-04-23 23:24:30 · 294 阅读 · 0 评论 -
Java自定义注解
Java自定义注解简介: Annotation事Java5开始引入的新特征,它提供了一种安全的类似注释的机制,用来将任何的信息和元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素加上更直观的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具或框架使用。它是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会...原创 2020-04-02 18:12:13 · 154 阅读 · 0 评论 -
Java Stream API
简介: A sequence of elements supporting sequential and parrallel aggregate operations,Stream是一组用来处理数组、集合的API。Java8 引入函数式编程的原因:代码简洁:函数时式编程写出的代码简洁且意图明确,使用Stream接口可以告别for循环,但是性能不一定比for循环好;多核友好:Java函数...原创 2020-04-01 22:15:52 · 238 阅读 · 0 评论 -
代理模式(静态代理、JDK动态代理、CGLib动态代理、Spring AOP)
定义:为其他对象提供一种代理,以控制对这个对象的访问,代理对象在客户端和目标对象之间起到中介的作用;类型:结构型;适用场景:保护代理对象;增强代理对象;优点:将代理对象与真实被调用的目标对象分离;一定程度上降低了系统耦合度,扩展性好;保护目标对象;增强目标对象;缺点:代理模式会造成系统设计中目标类增加;在客户端和目标对象之间增加一个代理对象,相对会造成请求处理速度...原创 2020-03-30 18:19:06 · 205 阅读 · 0 评论 -
ThreadLocal实现原理以及防止内存泄漏
ThreadLocal是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据。实现原理:public class Threadlocal { static ThreadLocal<Person> tl = new ThreadLocal<>(); public static void main(String[] ...原创 2020-03-27 22:44:13 · 177 阅读 · 0 评论 -
Java强软弱虚四种引用
Java有四种引用:强、软、弱、虚,一个变量指向new出来的对象,这就叫一个引用,不同的引用再JVM进行GC时会有不同的表现。如下代码重写了对象的finalize()方法,当该对象被虚拟机GC时,会调用该方法。在平时编程过程中,不能重写该方法,也不要自行调用该方法。public class M { @Override protected void finalize() thr...原创 2020-03-27 22:20:46 · 182 阅读 · 0 评论 -
Java栈上分配(逃逸分析、标量替换)
我们通过JVM内存分配可以知道JAVA中的对象都是在堆上进行分配,当对象没有被引用的时候,需要依靠GC进行回收内存,如果对象数量较多的时候,会给GC带来较大压力,也间接影响了应用的性能。为了减少临时对象在堆内分配的数量,JVM通过逃逸分析确定该对象不会被外部访问。那就通过标量替换将该对象分解在栈上分配内存,这样该对象所占用的内存空间就可以随栈帧出栈而销毁,就减轻了垃圾回收的压力。逃逸分析:...原创 2020-03-27 20:21:21 · 1244 阅读 · 0 评论 -
命令模式
定义:将“请求”封装成对象,以便使用不同的请求,命令模式解决了应用程序中对象的职责以及他们之间的通信方式;类型:行为型;适用场景:请求调用者和请求接收者需要接耦,使得使用者和接收者不直接交互;需要抽象出等待执行的行为;优点:降低耦合;容易扩展新命令或者一组命令;缺点:命令的无限扩展会增加类的数量,提高系统实现复杂度;课程命令举例:// 课程类public cla...原创 2020-03-23 11:48:15 · 165 阅读 · 0 评论 -
Java锁升级过程
markword实现表: Java对象头里的markword主要存储虚拟机有关该对象的运行数据,如hashcode、gc年龄和锁信息,实现表如下图所示: markword中最低的三位代表锁状态 其中1位是偏向锁位 两位是普通锁位。锁升级过程:当一个Java对象被new出来,markword最低的三位为:001,表示无锁态;Obiect o = new Object();当对...原创 2020-03-14 18:47:29 · 384 阅读 · 0 评论 -
Java对象内存布局
在Java虚拟机中,每一个Java对象都由标记字段(markword)、类型指针(class pointer)、实例数据(instance data)和内存对齐(padding)构成,数组对象还有数组长度(length,4字节)。markword里主要存储虚拟机有关该对象的运行数据,如hashcode、gc年龄和锁信息;class pointer则是表示该对象属于什么class;instanc...原创 2020-03-13 00:36:49 · 200 阅读 · 0 评论 -
面向对象技术
封装:将对象分为三种属性:私有,公有与保护(同一个包内无用),检查使用的对象在生命周期的生存状态,对象在相应的状态上才会产生相应的行为;继承和多态一定不会打破封装;对象间关系:关联、继承、组合、聚合、依赖;继承:子对象实例化过程中先实例化父对象;子对象与父对象方法重名,先调用子对象;子对象实例化相当于在子对象中加入一个父对象;父对象无用的东西也继承了,造成系统越来越大,有节制...原创 2020-03-03 23:17:43 · 142 阅读 · 0 评论 -
状态模式
定义:允许一个对象在其内部状态改变时,改变它的行为;类型:行为型;适用场景一个对象存在多个状态(不同状态行为不同),且状态可相互转换;优点将不同的状态隔离;把各种状态的转换逻辑,分布到state的子类中,减少相互间依赖;增加新的状态非常简单;缺点状态多的业务场景导致类数目增多,系统变复杂;视频状态转换举例// 视频状态抽象类public abstract cla...原创 2020-02-29 23:13:52 · 167 阅读 · 0 评论 -
策略模式
定义:定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户,且可以替换掉程序中大量的“if-else”语句;类型:行为型;适用场景系统有很多类,而它们的区别仅仅在于行为不同一个系统需要动态地在算法中选择出一种优点符合开闭原则可以避免大量的条件转移语句(if-else,switch)提供算法的保密性和安全性缺点客户端必须要知道...原创 2020-02-28 23:07:30 · 108 阅读 · 0 评论 -
桥接模式
定义:将抽象部分与它的具体实现部分分离,使它们都可以独立地变化,通过组合的方式建立两个类之间的联系,而不是继承;类型:结构型;适用场景抽象与具体实现之间增加更多的灵活性;一个类存在两个或多个独立变化的维度,且这两个或多个维度都需要独立进行扩展;不希望使用继承,因为多层继承会使系统类的数量剧增;优点分离抽象部分与其具体实现部分;提高了系统的可扩展性;符合开闭原则;符合组合复...原创 2020-02-23 10:38:59 · 185 阅读 · 0 评论 -
组合模式
定义:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使对单个对象和组合对象保持一致的方式处理;类型:结构型;优点:清楚地定义分层次的复杂对象,表示对象的全部或部分层次;让客户端忽略了层次的差异,方便对整个层次结构进行控制;简化客户端代码;符合开闭原则;缺点:限制类型时会较为复杂;使设计变得更抽象;举例// 目录组件public abstract cla...原创 2020-02-18 16:39:51 · 155 阅读 · 0 评论 -
适配器模式
定义:将一个类的接口转换成客户期望的另一个接口,使原本接口不兼容的类可以一起工作;类型:结构型;适用场景:已经存在的类,他的方法和需求不匹配时(方法结果相同或类似);不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品不同厂家造成功能类似而接口不相同情况下的解决方案;优点:能提高类的透明性和复用,现有的类复用但是不需要改变;目标类和适配器类解耦,提高程序扩展性;符合开...原创 2020-02-17 16:44:29 · 115 阅读 · 0 评论 -
装饰者模式
定义:在不改变原有对象的基础上,将功能附加到该对象,提供了比继承更有弹性的替代方案(扩展原有对象功能);类型:结构型;使用场景: 1、扩展一个类的功能,或给一个类添加附加职责; 2、动态地给一个类添加功能,这些功能可以动态地再撤销;优点: 1、继承的有力补充,比继承灵活,不改变原有对象的情况下给对象一个扩展功能; 2、通过使用不同装饰类以及这些装饰类的排列组合可以实现不同的效果; ...原创 2020-02-13 17:32:14 · 102 阅读 · 0 评论 -
设计模式(简单工厂、工厂模式和抽象工厂)
1、简单工厂定义:由一个工厂对象决定创建出哪一种产品类的实例。类型:创见型,但不属于GOF23种设计模式。适用场景:工厂类负责创建的对象比较少;客户端(应用层)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;缺点:工厂类的职责相对过重,增加新的产品,需要增加新的产品需要修改工厂类的判断逻辑,违背开闭原则。jdk中应用:Calendar类中的createCalendar方法...原创 2019-07-05 10:12:47 · 121 阅读 · 0 评论 -
《码出高效:Java开发手册》学习笔记(一)数组与集合
数组与集合都是用来存储对象的容器,前者性质单一,方便易用;后者类型安全,功能强大,且两者之间必然有相互转化的方式。毕竟他们性格迥异,在转换过程中,如果不注意转换背后的实现方式,很容易产生意料之外的问题。转换分成两种情况:数组转集合和集合转数组。1、数组转集合 在数组转集合的过程中,注意是否使用了视图方式直接放回数组中的数据。我们以 Arrays.asList() 为例,它把数组转换成集合...原创 2019-03-30 21:58:16 · 214 阅读 · 0 评论 -
Java8新特性:接口的静态方法和默认方法
1、接口增强Java 8 对接口做了进一步的增强:在接口中可以添加使用 default 关键字修饰的非抽象方法。即:默认方法(或扩展方法) 接口里可以声明静态方法,并且可以实现。 2、接口的静态方法java8中为接口新增了一项功能:定义一个或者更多个静态方法。类似于类中的静态方法,接口定义的静态方法可以独立于任何对象调用。所以,在调用静态方法时,不需要实现接口,也不需要接口的实...原创 2018-12-23 22:08:14 · 584 阅读 · 0 评论