自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 资源 (1)
  • 收藏
  • 关注

原创 类加载器与双亲委派模型

文章目录类加载器类与类加载器双亲委派模型类加载器虚拟机设计团队把类加载阶段中的 “通过一个类的全限定名来获取描述此类的二进制字节流” 这个动作放到 Java 虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为 “类加载器”。类与类加载器类加载器虽然只用于实现类的加载动作,但它在 Java 程序中起到的作用却远远不限于类加载阶段。对于任意一个类,都需要由...

2019-09-11 15:04:55 372

原创 高效并发之锁优化

文章目录锁优化自旋锁与自适应自旋锁消除锁粗化轻量级锁偏向锁锁优化HotSpot 虚拟机实现了各种锁优化技术,如适应性自旋(Adaptive Spinning)、锁消除(Lock Elimination)、锁粗化(Lock Coarsening)、轻量级锁(Lightweight Locking)和偏向锁(Biased Locking)等,这些技术都是为了在线程之间更高效地共享数据,以解决竞争问...

2019-09-06 16:52:51 440

原创 高效并发之线程安全

文章目录线程安全Java 语言中的线程安全线程安全的实现方法线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其它的协调工作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。简单来说,如果一个对象可以安全的被多个线程同时使用,那他就是线程安全的。Java 语言中的线程安全线程安全的话题是建立在多...

2019-09-06 15:00:58 418

原创 高效并发之 Java 与线程

文章目录Java 与线程线程的实现Java 线程调度状态转换Java 与线程线程的实现实现线程主要有3种方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。使用内核线程实现内核线程(Kernel-Level Thread,KLT)就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。...

2019-09-05 15:52:54 141

原创 高效并发之 Java 内存模型

文章目录Java 内存模型硬件的效率与一致性Java 内存模型主内存与工作内存内存间交互操作对于 volatile 型变量的特殊规则原子性、可见性与有序性先行发生原则Java 内存模型物理计算机中的并发问题与虚拟机中的情况有不少相似之处,物理机对并发的处理方案对于虚拟机的实现也有相当大的参考意义,所以我们先来了解一下物理计算机中的并发问题。硬件的效率与一致性物理计算机中,绝大多数的运算任务...

2019-09-05 13:11:47 133

原创 Java 程序编译与代码优化之编译优化技术

文章目录编译优化技术公共子表达式消除数组边界检查消除方法内联逃逸分析编译优化技术以一段代码来说明编译器是怎么优化代码的:优化前的原始代码:static class B { int value; final int get() { return value; }}public void foo() { y = b.get(); // ...do stuff... z =...

2019-09-03 15:59:12 441

原创 Java 程序编译与代码优化之运行期优化

文章目录程序编译与代码优化运行期优化HotSpot 虚拟机内的即时编译器解释器与编译器编译对象与触发条件方法调用计数器回边计数器程序编译与代码优化Java 对于程序的优化包含了编译期优化与运行期优化,其中编译器优化主要是提高了开发效率,比如自动装箱/拆箱、泛型、循环遍历等。运行期优化就是对代码转换为本地机器码的优化,可以提升程序运行速度。运行期优化Java 程序最初是通过解释器进行解释执行...

2019-09-03 14:30:55 793 1

原创 Java 垃圾收集之内存分配与回收策略

内存分配与回收策略Java 体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。对象的内存分配,往大方向讲就是在堆上分配,对象主要分配在新生代的 Eden 区上,如果启动了本地线程分配缓冲,将按线程优先在 TLAB 上分配。少数情况下也可能直接分配到老年代,分配的规则取决于使用哪一种垃圾收集器组合以及虚拟机中与内存相关的参数设置。介绍一下两...

2019-08-28 18:08:37 146

原创 Java 垃圾收集之垃圾收集器介绍

垃圾收集器垃圾收集器有并行、并发的,解释一下这两个名词:并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。并发(Concurrent):指用户线程与垃圾收集器线程同时执行(但并不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集器运行于另一个 CPU 上。垃圾收集器是内存回收的具体实现,HotSpot 虚拟机包含的收集器如图:上图中有...

2019-08-28 16:57:56 310

原创 Java 垃圾收集之垃圾收集算法及 HotSpot 算法实现

垃圾收集算法上一篇博我们探讨了垃圾收集时如何判断对象是否存活,这篇探讨一下垃圾收集器是怎么回收内存的,首先介绍三种垃圾收集算法。标记 - 清除算法最基础的收集算法是“标记 - 清除”(Mark-Sweep)算法,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记后统一回收所有被标记的对象。这种方式有两个不足:一个是效率低,另一个就是空间问题,清除之后会产生大量不连续的内...

2019-08-23 17:25:18 155

原创 Java 垃圾收集之判断对象是否存活

判断对象是否存活垃圾收集器工作前需要判断对象是否存活,那么垃圾收集器是如何判断的?判断标准又是什么?前面讲了 Java 内存区域各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法进入和退出执行出栈和入栈操作。每个栈帧中分配多少内存基本是在类结构确定下来时就已知的,因此这几个区域内存分配以及回收都具备确定性,不需要过多考虑回收问题,因为方法结束或者线程...

2019-08-23 16:13:08 167

原创 OutOfMemoryError 异常产生原因及其解决方案

OutOfMemoryError 异常在 Java 虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其它几个运行时区域都有发生 OutOfMemoryError 异常的可能。Java 堆溢出Java 堆用于存储对象实例,只要不断地创建对象,并且保证 GC Roots 到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量达到最大堆的容量限制后就会产生内存溢出异常。测试代码测试如...

2019-08-22 17:46:25 19163

原创 Java对象创建及访问过程

HotSpot 虚拟机对象创建过程1. 对象的创建虚拟机创建对象和运行时数据区密切相关,在Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象通常仅仅是一个 new 关键字而已,那么在虚拟机中对象的创建过程是什么样的?虚拟机遇到一个 new 指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如...

2019-08-22 16:02:44 364

原创 Java内存区域及其生命周期

运行时数据区域Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存分为若干不同的数据区域,包括以下几个数据区域:1. 程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器,字节码工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码命令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。由于 Java 虚拟机的多...

2019-08-22 14:28:19 761

原创 享元模式(二十)

享元模式:运用共享技术有效地支持大量细粒度的对象。比如做一个网页,但是会有不同的用途,有时是展示产品,有时展示博客。实际开发中,如果每次都创建一个新的对象,开销很大,所以我们用一个集合将对象存起来,后面有用到相同对象的直接从集合中取出,这就是享元模式的思想。举个例子:网站抽象类WebSite:所有网站(享元类)的超类或接口,通过这个接口,享元类可以接受并作用于外部状态:publi...

2019-07-25 21:49:10 105

原创 中介者模式(十九)

在系统设计中,尽管将一个系统分割成许多对象通常可以增加其可复用性,但是对象之间相互连接的激增又会降低其可复用性了。因为大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行任何较大的改动就十分困难了。迪米特法则告诉我们:如果两个类之间不必彼此直接通信,那么这两个类之间就不应该发生直接的相互作用。如果其中一个类需要调用另一个类的方法,可以通过...

2019-07-23 20:45:49 292

原创 职责链模式(十八)

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链处理请求,直到有一个对象处理它为止。这里发出这个请求的客户端并不知道这当中的哪一个对象最终处理这个请求,这样系统的更改可以不在影响客户端的情况下动态地重新组织和分配责任。职责链模式代码组成:Handler类,定义一个处理请示的接口:public abstract ...

2019-07-17 22:12:41 91

原创 命令模式(十七)

命令模式:将一个请求封装为一个对象,从而使得你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。比如我们去吃烧烤的时候,可以把每次点单当作一个请求,我们向服务员点单,然后服务员再通知厨师,下面用代码实现这一过程:烤肉串者类:public class Barbecuer { public void bakeMutton() { Sy...

2019-07-15 22:17:59 116

原创 单例模式(十六)

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保存它的唯一实例。这个类可以保证没有其它的实例可以创建,并且它可以提供一个访问该实例的方法。Singleton类,定义一个getInstance操作,允许客户访问它的唯一实例。getInstance是一个静态方法,主要负...

2019-07-11 21:03:39 88

原创 组合模式(十五)

组合模式:将对象组合成树形结构表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有统一性。例子:一套办公系统,总公司的人力资源部以及财务部在分公司也要用,这其实就是整体和部分可以被一致对待的问题,这时可以用组合模式解决。公司类:public abstract class Company { public String name; public...

2019-07-02 22:25:01 134

原创 备忘录模式(十四)

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先的状态。举个栗子:打游戏时候需要存档,BOSS打不过之后可以恢复之前的数据继续玩。游戏角色GameRolepublic class GameRole { /** * 生命力 */ private int vitality; ...

2019-06-26 23:02:02 200

原创 适配器模式(十三)

适配器模式:将一个类的接口转化为客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。举个栗子:姚明最初在NBA听不懂英文,这时就需要一个翻译,这个翻译就是姚明的适配器。在软件开发中,系统的数据和行为都正确,但接口不符时,我们应该考虑使用适配器,目的是使控制范围外的一个原有对象与某个接口匹配。适配器模式主要用于一些现存的类,但是接口又与复用环境...

2019-06-25 21:49:47 112

原创 状态模式(十二)

一个例子引出状态模式:每天的不同时间工作会有不同的工作状态,我们用面向对象来实现一下:工作类:public class Work { /** * 时间点 */ private int hour; /** * 工作是否完成 */ private boolean finish = false; public...

2019-06-12 23:13:05 3131 3

原创 抽象工厂模式(十一)

由一个例子引出抽象工厂模式:在实际开发中,我们有时会遇到切换数据库的需求,由于数据库之间的差异,不同数据库对数据表的增删改查操作也有差异。为了解决这个问题,我们很容易想到用工厂模式来实现:User类:public class User { private Integer id; // get set 方法...}IUser接口:用于客户端访问,解除与具体数据库访...

2019-06-05 00:06:29 157

原创 观察者模式(十)

观察者模式又叫做发布-订阅(Publish/Subscribe)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。观察者模式代码及组成:Subject类:可翻译为主题或抽象通知者,一般用一个抽象类或者一个接口实现。他把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任意...

2019-06-03 23:44:42 138

原创 建造者模式(九)

建造者模式:又叫生成器模式,可以将一个复杂对象的构建与它的表示相分离,使得同样的构建过程可以创建不同的表示。建造者模式可以将一个产品内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们使用了建造者模式,那么用户就只需要指定需要建造的类型就可以得到他们,而具体的建造过程和细节就不需要知道了。建造者模式(Builder)有几个重要的组成部分:建...

2019-05-21 22:02:59 131

原创 外观模式(八)

外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易复用。对于面向对象有一定基础的朋友,即使没有听说过外观模式,也完全有可能在很多时候使用它,因为它完美的体现了依赖倒转原则和迪米特法则的思想,所以是非常有用的设计模式之一。外观模式需要一个外观类,它需要了解所有的子系统的方法或属性,进行组合,以备外界调用。外观类,知道哪些子系统负责处...

2019-05-16 21:59:40 127

原创 @PostConstruct注解作用

从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法,并且被修饰的方法不能抛出异常。写法有如下两种方式:@PostConstructpublic void method(){}public @PostConstruct void method()...

2019-05-15 18:09:49 14663 2

原创 模板方法模式(七)

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。下面以一个试卷的例子说明模板方法模式:有一个试卷类TestPaper,其中包含了试题:/** * 考试试卷 */public class TestPaper { public void testQuestion1(){ ...

2019-05-14 22:32:19 198

原创 原型模式(六)

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何的创建细节。原型模式需要一个原型类,在Java中的Object类中有clone()方法,只需要实现Cloneable接口即可完成原型模式。下面以写简历的例子来说明原型模式:简历包含姓名,年龄以及工作经验信息简历对象:public c...

2019-05-09 15:32:19 126

原创 工厂方法模式(五)

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。之前写过一篇简单工厂模式,其中有一个计算器的例子,那么工厂方法模式和简单工厂模式有什么区别呢?简单工厂VS工厂方法:在简单工厂模式中,如果要增加一个功能需要修改工厂类,违背了开放-封闭原则,工厂方法模式在简单工厂模式上新增加了一个工厂,用来生产简单工厂类,这样整个工厂和产品体系都没...

2019-05-07 22:20:36 110

原创 代理模式(四)

代理模式:为其他对象提供一种代理以控制对这个对象的访问。使用代理模式可以间接的访问对象,代理对象和被代理对象需要实现相同的接口或者继承相同的类,这样才能达到代理的效果。代码演示:Subject类:代理对象和被代理对象相同的父类,定义了 RealSubject 和 Proxy 共用的接口,这样就在任何使用 RealSubject 的地方都可以使用 Proxy。public ab...

2019-05-06 21:45:58 156

原创 装饰器模式(三)

装饰器模式:动态的给一个对象添加一些额外的职责,就增加新功能来说,装饰模式比生成子类更加灵活。简单来说,装饰器模式就是在不改动原有类的基础上,为扩展原有类功能。下面是装饰器模式的基本实现:原有的类:/** * 原始的抽象类 */public abstract class Component { /** * 原有的功能 */ public ...

2019-04-25 21:17:30 192

原创 面向对象设计原则

一、单一职责原则(SRP)单一职责原则,是说功能要单一。就一个类而言,应该仅有一个引起它变化的原因。也就是说,一个类要专注于一个作用,不应该将许多功能耦合到同一个类中。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其它职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。软件设计真正要做的许多内容,就是发现职责...

2019-04-22 21:40:50 357

原创 策略模式(二)

策略模式:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。应用场景:经常会变的需求可以用策略模式,将这些需求的算法抽象出来,形成一个策略类,然后具体的算法实现抽象类方法,完成不同的功能。举例:商场收银,会进行不同的促销活动,比如打折,满减等。分析:根据需求,我们可以用简单工厂模式实现,但是每次新增加一个优惠类型就要修改工厂方法,这并不是最好...

2019-04-17 21:54:03 330 3

原创 简单工厂模式(一)

需求:实现一个简单的计算器。简单工厂模式:工厂即实例化所需类的方法,根据传入参数的不同返回不同的实例化方法,即多态的思想。作用:利于程序扩展,将来要添加一个功能只需要继承父类,重写相应的方法即可。应用场景:解决如何实例化对象的问题,根据不同的场景实例化不同的对象。示例代码——使用面向对象的方法实现一个简单的计算器:只需要输入运算符号,工厂就实例化出合适的对象,通过多态返回父类的...

2019-04-15 22:11:09 266

原创 Mybatis查询报错:There is no getter for property named '__frch_productId_0'

Mybatis 报错: There is no getter for property named '__frch_productId_0'  的原因主要是Mapper接收的查询参数为一个非List的对象,而在sql语句中遍历对象中的List直接取值导致的。Mapper:  其中 parameterType类型并不是一个List<select id="getProductAuth...

2018-12-12 15:45:51 1944

原创 Linux下Java图片和文字合成成功后文字不显示的问题

最近使用Java将字体写到图片上时遇到了一个问题,写文字的时候英文字母可以正常写上,而中文却消失了,由于我本地代码是在Windows环境下运行的,而上传到服务器是在Linux环境下运行的,在本地的图片和文字可以正常合成,而上传到服务器后就凉了。。最后发现原来是Java找不到相应字体类型导致的,具体代码如下:/** * 图片上写文字 * @param backgroundI...

2018-08-31 14:43:28 2693 1

原创 Java8之Lambda表达式、函数式接口、方法引用

Java8之前写一个比较器

2018-06-25 14:12:09 524

原创 SpringMVC获取页面参数的问题

有时用SpringMVC的注解@PathVariable和@RequestParam接收页面值的时候,会接收不到,会看到如下错误:{ "msg":"Missing URI template variable 'noticeId' for method parameter of type int", "code":500 }目前遇到的有两种情况会导致出现上面的错误情况:第一种:页

2018-01-11 16:13:31 3378

postman+interceptor压缩包

免费Postman和Postman interceptor压缩包,Postman为文件夹,直接选择扩展程序中的 加载已解压的扩展程序 ,选择解压后的postman文件夹即可,postman-interceptor为crx文件,直接拖入到chrome://extensions/中即可

2019-02-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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