自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 Nginx简介、安装(Linux)与脚本自启动

Nginx  Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在BSD-like 协议下发行,由俄罗斯的程序设计师Igor Sysoev所开发。其特点是占有内存少,并发能力强,并发能力在同类型的网页服务器中表现较好,中国使用Nginx网站用户有:新浪、网易、腾讯等。Nginx相对于Apache的优点:轻量级,同样的web服务,比Apache占用更少的内存及资源;抗并发,Nginx处理请求是异步非阻塞的,而Apache则是阻塞型的,在高并发下ngi

2020-05-30 13:13:19 236

原创 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 670

原创 CPU的乱序执行和合并写技术

CPU的乱序执行:  CPU在进行读等待的同时执行指令,是CPU乱序的根源,这其实不是乱,而是提高效率。例如指令1去内存读数据,因为CPU与内存访问速度相差100倍,如果指令2的执行过程不需要依赖指令1,那么指令2可以先执行,乱序执行的本质是同时执行。Java对象的创建过程不是一个原子操作,极有可能出现指令重排序,下面通过Java对象创建的汇编码讲解。// 源码:class T { int num = 8;}T t = new T();// 汇编码:0 new #2 <T>

2020-05-15 16:34:23 1111 2

原创 存储器层次结构、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 752 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 3137

原创 Java自定义类加载器(Tomcat类加载器)

自定义类加载器:  因为系统的ClassLoader只会加载指定目录下的class文件,如果你想加载自己的class文件,那么就可以自定义一个ClassLoader。而且我们可以根据自己的需求,对class文件进行加密和解密,自定义类加载器步骤如下:继承抽象类ClassLoader;重写findclass(String name)方法;调用defineClass(String name,...

2020-04-26 16:51:31 337

原创 Java类加载机制(类加载器、双亲委派)

类加载的时机创建类的实例:new、反射、反序列化、clone;访问类中的某个静态变量,或者对静态变量进行赋值;主动调用类的静态方法;ClassForName(“包类名”),得到的class已经初始化完成,ClassLoader.loadClass(“包类名”)得到的class是还没有链接(验证,准备,解析)的;完成子类的初始化,也会完成对本类的初始化(接口除外);该类是程序引导入口(...

2020-04-26 16:45:17 155

原创 使用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 245

原创 观察者模式

定义:定义了对相间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有观察者都会收到通知并更新。类型:行为型;适用场景:关联行为场景、建立一套触发机制;优点:观察者和被观察者之间建立一个抽象的耦合;观察者模式支持广播通信;缺点:观察者之间有过多的细节依赖,提高时间消耗及程序复杂度;使用要适当,要避免循环调用;观察者模式UML类图:示例:...

2020-04-03 22:59:35 121

原创 责任链模式

定义:为请求创建一个接收此次请求对象的链,对该请求对象执行一系列的操作。类型:行为型;使用场景:一个请求的处理需要多个对象当中的一个或几个协作处理;优点:请求的发送者和接收者(请求的处理)解耦;责任链可以动态组合;缺点:责任链太长或者处理时间过长,影响性能;责任链有可能过多;示例:  本文通过博客(Blog)发布流程中的title、author、type、content...

2020-04-03 19:59:12 87

原创 Java自定义注解

Java自定义注解简介:  Annotation事Java5开始引入的新特征,它提供了一种安全的类似注释的机制,用来将任何的信息和元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素加上更直观的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具或框架使用。它是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。注解不会...

2020-04-02 18:12:13 104

原创 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 196

原创 代理模式(静态代理、JDK动态代理、CGLib动态代理、Spring AOP)

定义:为其他对象提供一种代理,以控制对这个对象的访问,代理对象在客户端和目标对象之间起到中介的作用;类型:结构型;适用场景:保护代理对象;增强代理对象;优点:将代理对象与真实被调用的目标对象分离;一定程度上降低了系统耦合度,扩展性好;保护目标对象;增强目标对象;缺点:代理模式会造成系统设计中目标类增加;在客户端和目标对象之间增加一个代理对象,相对会造成请求处理速度...

2020-03-30 18:19:06 165

原创 ThreadLocal实现原理以及防止内存泄漏

  ThreadLocal是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据。实现原理:public class Threadlocal { static ThreadLocal<Person> tl = new ThreadLocal<>(); public static void main(String[] ...

2020-03-27 22:44:13 141

原创 Java强软弱虚四种引用

  Java有四种引用:强、软、弱、虚,一个变量指向new出来的对象,这就叫一个引用,不同的引用再JVM进行GC时会有不同的表现。如下代码重写了对象的finalize()方法,当该对象被虚拟机GC时,会调用该方法。在平时编程过程中,不能重写该方法,也不要自行调用该方法。public class M { @Override protected void finalize() thr...

2020-03-27 22:20:46 144

原创 Java栈上分配(逃逸分析、标量替换)

  我们通过JVM内存分配可以知道JAVA中的对象都是在堆上进行分配,当对象没有被引用的时候,需要依靠GC进行回收内存,如果对象数量较多的时候,会给GC带来较大压力,也间接影响了应用的性能。为了减少临时对象在堆内分配的数量,JVM通过逃逸分析确定该对象不会被外部访问。那就通过标量替换将该对象分解在栈上分配内存,这样该对象所占用的内存空间就可以随栈帧出栈而销毁,就减轻了垃圾回收的压力。逃逸分析:...

2020-03-27 20:21:21 1173

原创 命令模式

定义:将“请求”封装成对象,以便使用不同的请求,命令模式解决了应用程序中对象的职责以及他们之间的通信方式;类型:行为型;适用场景:请求调用者和请求接收者需要接耦,使得使用者和接收者不直接交互;需要抽象出等待执行的行为;优点:降低耦合;容易扩展新命令或者一组命令;缺点:命令的无限扩展会增加类的数量,提高系统实现复杂度;课程命令举例:// 课程类public cla...

2020-03-23 11:48:15 141

原创 Java锁升级过程

markword实现表:  Java对象头里的markword主要存储虚拟机有关该对象的运行数据,如hashcode、gc年龄和锁信息,实现表如下图所示:  markword中最低的三位代表锁状态 其中1位是偏向锁位 两位是普通锁位。锁升级过程:当一个Java对象被new出来,markword最低的三位为:001,表示无锁态;Obiect o = new Object();当对...

2020-03-14 18:47:29 344

原创 Java对象内存布局

  在Java虚拟机中,每一个Java对象都由标记字段(markword)、类型指针(class pointer)、实例数据(instance data)和内存对齐(padding)构成,数组对象还有数组长度(length,4字节)。markword里主要存储虚拟机有关该对象的运行数据,如hashcode、gc年龄和锁信息;class pointer则是表示该对象属于什么class;instanc...

2020-03-13 00:36:49 169

原创 操作系统学习笔记(进程、线程、CPU调度、死锁)

1、进程与线程进程:父进程先创建,子进程后创建,但是子进程先死亡,因为子进程可能需要共享父进程的资源;进程中止原因:进程结束、进程终止、内存清除;生产者-消费者:生产者进程是产生数据的进程,在硬盘中读取数据到内存;中间线程将缓冲区1的数据解压到缓冲区2;消费者进程是消费数据的进程,将缓冲区2将数据显示;生产者消费者一定是时间片轮转,不是批处理,否则会陷入无尽的等待;原语:执行过程中不...

2020-03-03 23:29:33 188

原创 数据库设计与开发学习笔记

1、关系数据模型关系模型三要素:关系数据结构,关系操纵,关系完整性;关系:关系是笛卡尔积的有限子集,所以关系也是一个二维表,表的每行对应一个元组,表的每列对应一个域;D1xD2 = D2xD1,表的行和列不敏感;非关系数据库实体用记录表达,关系用指针表达;非关系型数据库直接用指针表达,查询速度较快,但是关系的调整非常麻烦,指针是写死的,关系型数据库的更新性能更好;关系操作:增删改查;...

2020-03-03 23:25:23 288

原创 面向对象技术

封装:将对象分为三种属性:私有,公有与保护(同一个包内无用),检查使用的对象在生命周期的生存状态,对象在相应的状态上才会产生相应的行为;继承和多态一定不会打破封装;对象间关系:关联、继承、组合、聚合、依赖;继承:子对象实例化过程中先实例化父对象;子对象与父对象方法重名,先调用子对象;子对象实例化相当于在子对象中加入一个父对象;父对象无用的东西也继承了,造成系统越来越大,有节制...

2020-03-03 23:17:43 110

原创 Linux程序基础与程序设计学习笔记

1、Linux基础指令man +指令:可以查看命令手册;$PATH:输入命令可以执行,是因为PATH告诉你这些命令在哪;whereis/which:在目录中找文件或目录;id:可以看出自己的用户身份,属于哪个组;finger + user:可以看出登录用户的登录情况以及键盘空闲时间;du -sh 查看服务器空间;du -sh directory/ 查看目录空间;du -sh fi...

2020-03-03 22:55:15 187

原创 状态模式

定义:允许一个对象在其内部状态改变时,改变它的行为;类型:行为型;适用场景一个对象存在多个状态(不同状态行为不同),且状态可相互转换;优点将不同的状态隔离;把各种状态的转换逻辑,分布到state的子类中,减少相互间依赖;增加新的状态非常简单;缺点状态多的业务场景导致类数目增多,系统变复杂;视频状态转换举例// 视频状态抽象类public abstract cla...

2020-02-29 23:13:52 133

原创 策略模式

定义:定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户,且可以替换掉程序中大量的“if-else”语句;类型:行为型;适用场景系统有很多类,而它们的区别仅仅在于行为不同一个系统需要动态地在算法中选择出一种优点符合开闭原则可以避免大量的条件转移语句(if-else,switch)提供算法的保密性和安全性缺点客户端必须要知道...

2020-02-28 23:07:30 81

原创 桥接模式

定义:将抽象部分与它的具体实现部分分离,使它们都可以独立地变化,通过组合的方式建立两个类之间的联系,而不是继承;类型:结构型;适用场景抽象与具体实现之间增加更多的灵活性;一个类存在两个或多个独立变化的维度,且这两个或多个维度都需要独立进行扩展;不希望使用继承,因为多层继承会使系统类的数量剧增;优点分离抽象部分与其具体实现部分;提高了系统的可扩展性;符合开闭原则;符合组合复...

2020-02-23 10:38:59 155

原创 组合模式

定义:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使对单个对象和组合对象保持一致的方式处理;类型:结构型;优点:清楚地定义分层次的复杂对象,表示对象的全部或部分层次;让客户端忽略了层次的差异,方便对整个层次结构进行控制;简化客户端代码;符合开闭原则;缺点:限制类型时会较为复杂;使设计变得更抽象;举例// 目录组件public abstract cla...

2020-02-18 16:39:51 110

原创 适配器模式

定义:将一个类的接口转换成客户期望的另一个接口,使原本接口不兼容的类可以一起工作;类型:结构型;适用场景:已经存在的类,他的方法和需求不匹配时(方法结果相同或类似);不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品不同厂家造成功能类似而接口不相同情况下的解决方案;优点:能提高类的透明性和复用,现有的类复用但是不需要改变;目标类和适配器类解耦,提高程序扩展性;符合开...

2020-02-17 16:44:29 83

原创 装饰者模式

定义:在不改变原有对象的基础上,将功能附加到该对象,提供了比继承更有弹性的替代方案(扩展原有对象功能);类型:结构型;使用场景: 1、扩展一个类的功能,或给一个类添加附加职责; 2、动态地给一个类添加功能,这些功能可以动态地再撤销;优点: 1、继承的有力补充,比继承灵活,不改变原有对象的情况下给对象一个扩展功能; 2、通过使用不同装饰类以及这些装饰类的排列组合可以实现不同的效果; ...

2020-02-13 17:32:14 71

原创 容器实现单例模式

  容器单例模式使用的是HushMap,作为缓存使用,线程不安全,但是易于管理,可在合适的场景下使用,具体实现如下:public class ContainerSingleton { private ContainerSingleton(){} private static Map<String,Object> singletonMap = new HashMap&...

2019-11-18 21:43:20 353

原创 枚举实现单例模式可避免序列化和反射攻击

  枚举类型天然的可序列化机制,能够强有力的保证不会出现多次实例化的情况,即使在复杂的序列化或者反射攻击的情况下,枚举类型的单例模式都没有问题。枚举类型的单例可能是实现单例模式中的最佳实践,《Effcetive Java》这本书也是强力推荐这种写法。1、枚举实现单例模式public enum EnumInstance { INSTANCE; private Object dat...

2019-11-18 21:42:28 389

原创 反射攻击解决方案及原理分析

  反射可以通过修改私有构造器的访问权限,或者修改单例类的某些属性值,来获取新的实例,从而破坏单例模式。public class Test { public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, IllegalAccessExce...

2019-11-18 21:39:40 524

原创 序列化破坏单例模式原理解析及解决方案

  将单例对象序列化和反序列化操作后得到的新对象与原单例对象并不相同,因为反序列化是通过反射获取的新对象。public class Test { public static void main(String[] args) throws IOException, ClassNotFoundException { HungrySingleton hungrySingleto...

2019-11-18 21:38:36 213

原创 单例模式(懒汉式、静态内部类、饿汉式)

单例模式定义:保证一个类仅有一个实例,并提供一个全局访问点。类型:创建型。适用场景:想确保在任何情况下都只有一个实例(程序计数器、数据库连接池、线程池)。优点:在内存里只有一个实例,降低了内存开销;可以避免对资源的多重占用;设置全局访问点,严格访问控制;缺点:没有接口,扩展困难。重点:私有构造器,禁止从外部创建对象;线程安全;延迟加载,使用时再创建;序列化和反序列化...

2019-11-15 08:50:23 732

原创 设计模式(简单工厂、工厂模式和抽象工厂)

1、简单工厂定义:由一个工厂对象决定创建出哪一种产品类的实例。类型:创见型,但不属于GOF23种设计模式。适用场景:工厂类负责创建的对象比较少;客户端(应用层)只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;缺点:工厂类的职责相对过重,增加新的产品,需要增加新的产品需要修改工厂类的判断逻辑,违背开闭原则。jdk中应用:Calendar类中的createCalendar方法...

2019-07-05 10:12:47 92

原创 《码出高效:Java开发手册》学习笔记(一)数组与集合

  数组与集合都是用来存储对象的容器,前者性质单一,方便易用;后者类型安全,功能强大,且两者之间必然有相互转化的方式。毕竟他们性格迥异,在转换过程中,如果不注意转换背后的实现方式,很容易产生意料之外的问题。转换分成两种情况:数组转集合和集合转数组。1、数组转集合  在数组转集合的过程中,注意是否使用了视图方式直接放回数组中的数据。我们以 Arrays.asList() 为例,它把数组转换成集合...

2019-03-30 21:58:16 182

原创 Java8新特性:接口的静态方法和默认方法

1、接口增强Java 8 对接口做了进一步的增强:在接口中可以添加使用 default 关键字修饰的非抽象方法。即:默认方法(或扩展方法) 接口里可以声明静态方法,并且可以实现。 2、接口的静态方法java8中为接口新增了一项功能:定义一个或者更多个静态方法。类似于类中的静态方法,接口定义的静态方法可以独立于任何对象调用。所以,在调用静态方法时,不需要实现接口,也不需要接口的实...

2018-12-23 22:08:14 536

空空如也

空空如也

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

TA关注的人

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