自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 volatile实际场景

很多场景下:用了volatile关键字锁都可以不用了。volatile在store前加锁和 在主内存中加锁有本质区别:1.在主内存中加锁横跨了整个线程的执行过程,但是如果把锁加在store中,这个线程的主流程基本已经做完了,最终加锁只是给赋值加一个锁 2. 锁store和write这两个操作,这两个操作只是给主内存的一个变量,一个内存地址写一个值。而修改一个主内存中的值,速度是非常快的,volatile只是在修改地址的那一刻加一把锁,对程序性能的影响是非常小的。...

2022-01-14 17:42:19 183

原创 volatile源码解析

查过汇编开发手册以后,lock对硬件级别实现了这么几处含义,实现了这么两处标准的规范:1.只要看到前面有lock,CPU会将当前处理器缓存行的数据立即写回到内存。如果不加lock前缀,不一定马上同步回主内存,时机是不确定的,有可能线程还要执行很多其他的业务代码。2.这个写回内存的操作会实现这个变量的有序性(引起其他CPU里缓存了该内存地址的数据无效)。java代码是比较上层的操作,一行java代码可能会对应好多出硬件底层数据的回写。volatile store前加锁vo.

2022-01-14 17:40:33 256

原创 volatile底层源码查看

点击volatile会发现点不进去,因为它的底层不是java实现的,也不是C语言,而是C语言底下与CPU,内存打交道的汇编语言。要分析java代码对应底层的汇编语言,可以分析java代码底层的字节码,从字节码中可以看到java底层虚拟机执行的细节,查看步骤:1.将hsdi-amd64.dll放到jdk的jre的bin目录下2.加一段参数,将这段参数放到虚拟机的运行参数里面来。再把jre换成刚刚换的那个生成汇编的包里面。只要加上这个两个,就可以把java代码对应底层的汇编.

2022-01-14 17:33:18 413

原创 通俗易懂讲解volatile

java中,对于加了volatile关键字的属性,对这个属性进行修改时,会直接将CPU高级缓存中的数据写回到主内存,对这个变量的读取也直接从主内存中读,从而保证了可见性。 但是这里的原理涉及到了c语言的底层的汇编语言,理解起来比较复杂,我们可以从线程里面的内存从主内存交互的 整个过程来解释它为什么能保证可见性内存从主内存交互的 整个过程,包括了它底层的汇编流程 这儿有一个插板就是主内存,两个插座分别是...

2022-01-14 17:24:01 146

原创 Volatile和synchronized区别

这个问题需要有一个极度的抽象,需要在一两句话之内就要给面试官讲清楚Volatile是什么?1.Volatile和synchronized区别并发编程有三大特性:原子性:不可分割的操作,多个步骤要保证同时成功或同时失败。有序性:程序执行的顺序和代码的顺序保持一致。可见性:一个线程对共享变量的修改,另一个线程能立马看到。synchronized 关键字用来加锁,volatile只是用来保持变量的线程可见性,有序性,通常适用于一个线程写,多个线程读的场景。2.Volatile能不能

2022-01-14 17:16:37 311

原创 Buffer中的四个核心属性

缓冲区(Buffer)缓冲区在Java NIO 中负责数据的存取。缓冲区的底层就是数组。用于存储不同类型的数据。根据数据类型不同,提供了相应类型的缓冲区。除了boolean以外,其它的都有。这些缓冲区的使用方式几乎类似。最常用的就是ByteBuffer,因不管是磁盘还是网络,底层都是字节。不同类型的缓冲区都继承自一个父类Buffer。Buffer中包含四个核心属性,这四个属性必须很清楚,如果搞不清楚,就没有办法对缓冲区中的数据进行存取。 capacity:容量,表示缓冲区中最大存储数据的容

2020-11-11 16:46:12 809

原创 并发与并行

集合只要是不安全的,那么他就是多线程的,多线程意味着他的速度要快,比如边打游戏边听歌。并发:指两个或多个事件在同一时间段内发生我们的电脑执行任务是用CPU来执行他现在电脑的CPU都是多核心多线程并发指的就是交替执行,一会儿执行任务一,一会儿执行任务二。并行:两个或多个事件同时发生,同时执行并发是交替,并行是同时,相当于一个人吃两个馒头和两个人吃两个馒头我们的电脑同时开着QQ,ID...

2019-12-28 11:37:22 362

原创 static关键字详解

1.概述: static:就是多个对象共享同一份数据一个类的不同对象有些共享的数据,这样我们就可以使用static来修饰一旦使用了static关键字,那么这样的内容不再属于对象,而是属于类的,所以凡是本类的对象,都共享同一份。可以用来修饰成员变量,修饰成员方法,以及静态代码块儿。2.修饰成员变量:如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类,多个对象共享同一份数据。...

2022-01-31 17:29:21 12134 2

原创 什么是RESTFul?

什么是RESTFul?REST 是Representational [reprɪzenˈteɪʃənl] State Transfer的缩写,翻译是”表现层状态转化”。REST不是一组新的技术,它就是一组规范和一组约束条件。可以实现不同系统之间的资源共享,因为REST统一了客户端访问资源的接口如架构符合REST的约束条件和原则的架构,就称它为RESTFul架构。表现层状态转移。表现层指的是资源的表述:在系统中,资源可以是一段文本,可以是一张图片,一个文件,还可以是一个服务,总之就是一

2022-01-20 16:09:49 714

原创 SpringBoot自动装配原理(run方法)

SpringBootApplication只是启用了自动配置,为什么能自动配置呢?run方法也是实现了三个功能原理总结:1.提前写好一个类,把配置提前配好。2.一旦引了相关依赖,自动配置就生效了。3.配置可以进行覆盖。覆盖它的属性。源码点击去会发现返回一个run,接着跟:在这个run里面new了一个对象,new完了以后调run。new对象的时候把当前类传进去了。 继续跟进,发现它把SpringApplication这个类传了进...

2022-01-20 16:05:37 346

原创 SpringBoot自动装配原理(SpringBootApplication注解)

SpringBoot使用时会发现,很多之前SpringMVC的配置都不需要配置我们可以直接拿来使用了,所有的配置一个都没配,甚至tomcat的端口都没有。这些配置都去哪儿了呢?为什么什么都不配就可以使用呢?其魔力所在就在SpringBoot的启动类上。启动类中一共有两个东西,一个SpringBootApplication注解,一个run方法。先看SpringBootApplication:点进去除了元注解的东西外,有三个特殊的注解,一个SpringBootConfi...

2022-01-20 15:58:56 548

原创 cookie、session、token的区别

很多网站我们登陆过以后会发现,登陆过一次以后,很长一段时间内就不需要登陆了。但是http是无状态的,也就是说这次访问了服务器,关闭网页,再次访问服务器,服务器是没有意识到又是你来访问。如果淘宝不想让已经登陆过的用户再次输入账号密码,就得使用到存储了,这个时候可以选择让浏览器记住账号密码,浏览器得想办法帮我们在每一次请求里加入用户名密码,实现每一次HTTP请求都自动带数据给服务器的技术,这个时候就要用到cookie。cookie基本流程:...

2022-01-19 21:10:39 388 1

原创 Thread和Runable的区别

能问出这个问题的面试官说明他水平也一般般。因为Thread是一个类,Runable是一个接口。Thread本身是实现了Runable接口的,要说他们有什么区别,无非是使用上的区别:Thread和Runable的实质是继承关系,没有可比性。无论使用Runable还是Thread,都会new Thread ,然后执行run方法。用法上如果由复杂的线程操作要求,那就继承Thread,如果只是简单的执行一个任务,那就实现Runable。...

2022-01-18 22:19:30 1192

原创 SpringAOP增强类型

最早AOP不是Spring提出来的,它是由一个组织叫AOP联盟的组织定义的一些规范,只不过Spring是实现了这套规范最好的一个框架。AOP联盟已经为通知(增强)定义了一个接口Advice。org.application.Interface.AdviceSpring按照通知Advice在目标类方法的连接点位置,分为5类:比如:在插入数据库方法之前进行权限校验,在插入之前做的事情就是前置通知。删除表里面某条记录时,记录一个日志,在目标方法之后做的事情,就是后置通知。.

2022-01-18 17:52:42 811

原创 Spring中AOP的相关术语

1.连接点 joinpoint这些点指的是方法,就是业务层接口中的所有的方法都是连接点,连接业务和增强方法中的点。增删改成这些方法全都是连接点,连接业务和增强方法中的点,把这些方法加上事务的支持,形成一个完整的业务逻辑。spring只支持方法类型的连接点。2.切入点 Pointcut不是业务层中所有的方法都被增强,在连接点中被增强的方法(比如业务层被事务支持的方法)可以被称为切入点。所有的切入点都是连接点。3.Advice(通知/增强)通知是指拦截到连接点之后要做的事情。

2022-01-18 17:50:57 159

原创 线程池的使用

创建:线程池对象怎么创建呢?通过JUC并发工具包提供的一个ThreadPoolExecutor[ɪɡˈzekjətər]这样一个类就可以创建了。它有七个参数:1.核心线程数,就相当于默认三个柜台。2.最大线程数,最多是五个窗口3.存活时间,如果长时间没有接到任务,就可以下班回家了。比如设置一秒钟4.第四个是时间单位,用秒。5.等待队列,相当于等候区。new 一个ArrayBlockingQueue,长度为36.线程工厂,因为通过线程工厂去创建线程对象,线程工厂不.

2022-01-18 15:22:23 47

原创 线程池内部实现思想(只是思想,没有源码)

作用:提高资源的利用率。如果不使用线程池,我们对线程的操作是:1.需要手动创建线程对象2.执行任务3.执行完毕,释放线程对象。这样的话,它的资源利用率很低,就相当于来一个任务,创建一个对象,执行完后把对象扔掉,下一个来继续创建继续仍。就相当于您现在面试我雇佣我入职去做需求写代码,使用完把我辞退了,需求来了 继续面试然后入职。这样成本是非常高的。而使用线程池就是让资源重复利用。思想:创建很多线程对象放到线程池中,当有任务来的时候,从线程池中拿出来,执行完以后还回来,供下一次

2022-01-18 14:29:24 250

原创 什么是指令重排?

什么是指令重排? 程序执行时,CPU需要从内存里面读数据,CPU的执行速度时比内存要快很多很多的,这个时候如果说有两个这样的指令:1.去内存中读一个数据,然后从内存里面返回一个值。2.CPU做另外一个操作,对里面的值做一个计算,比如说对寄存器里面某一个值进行加1减1这样的一个操作。这个时候就会造成这样一个情况,CPU的运算速度很快,但是到内存里面的执行速度相对来说是很慢的,在等内存把数据加载过来的过程中,CPU只能抽根烟在那儿等着。...

2022-01-17 21:39:09 698

原创 AOP作用及其优势

作用:在程序运行期间,在不修改源码的基础上对方法进行功能增强。优势:减少重复代码,提高开发效率,并且便于维护。比如要对所有的方法增加一个日志控制的功能,将来要改这个功能,只需要改一个地方就可以了。AOP并不是像上图一样把日志控制功能引用。但是这三个功能和这个日志控制的功能依然耦合死了,是在一块儿的。在AOP中,这三个功能和日志控制的功能都是单独的功能!AOP是在内存中运行时将他们结合在一起。通过配置的方式来决定谁和谁结合。目标方法和要增强的功能就是切面..

2022-01-16 22:22:04 1567

原创 AOP基本概念

1.OOP(面向对象)的不足:1.如果方法的名字变了,所有用到他的地方都要变2.方法的位置变了,也会变2.AOP:面向切面编程,是函数式编程的一种衍生类型。切面就是切入点和通知的组合作用:在程序运行期间,不修改源码对已有方法进行增强。通过代理方式向目标类植入增强代码。关键字:AOP是运行期间执行的,是通过动态代理来执行。Spring的AOP和动态代理的作用是一样的,AOP就是动态代理。,只不过spring把动态代理封装了,通过spring配置的方式,就能实现功能的增强。利

2022-01-16 22:19:09 203

原创 什么是DCL(Double Check Lock)单例?

普通的单例模式:单例模式的关键就是在启动的时候就创建一个实例,然后把构造函数私有化,别人就没办法通过函数再new一个对象出来了。然后引入一个方法,返回这个实例就可以了。但是这个时候很多人会较真,认为这个实例不管用没用,启动的时候就创建了,感觉没有必要,就要再用到它的时候再去加载,这个时候可以这样写:在用到它的时候判断是不是为空,为空的话创建一个singleDemo。这样的话有一个问题就是这个单例是线程不安全的,当有很多线程进来的时候;1.第一个线程进来判断是不是空,...

2022-01-16 21:53:33 1117

原创 编码与转换流

每一个编码对应不同的字符集:制定了编码,它所对应的字符集也就指定了,所以编码才是最终要关心的ASCII字符集:美国信息交换标准代码ISO:拉丁编码GBXX:GB是国际的意思,为了显示中文而设计的一套字符集GBK:最常用的中文码表Unicode字符集:表达任意语言的任意字符。最常用的是UTF8编码。工作中最多。GBK是两个字节存储一个汉字,UTF-8是三个字节来存储一个汉字。编码引出的问题:FileReader可以读取IDE默认编码格式(UTF-8)的文件FileReader读取系统默认

2020-11-10 15:57:38 168

原创 Object类

ObjectObject类Object类是java语言的根类,即所有类的父类,任何一个类都可以使用Object的方法从这块儿我们可以看出来,直接打印对象的名字,就是打印他的toString方法p = p.toString();我们把他返回成我们要的变量,会发现输出打印的变成了我们重写后的。实际过程中我们不用自己来重写,我们只需alt + insert ,点击toString即...

2020-01-01 13:26:26 151 1

原创 整合时间类Date要点及注意事项

概述类 Date:是一个表示日期和时间的类表示特定的瞬间,精确到毫秒一千毫秒等于一秒作用:计算某个时间段中间一共有多少天可以日期转换为毫秒进行计算,计算完毕,再把毫秒转换为日期1.把日期转换为毫秒:当前的日期:2019-12-31时间原点(0毫秒):1970年1月1日 00:00:00就是计算当前日期到时间原点之间一共经历了多少毫秒。1577757246483是一个long类...

2020-01-01 13:22:17 382

原创 Calendar类

Calendar类Calendar类,日历类是一个抽象类,里边提供了很多操作日历字段的方法因为是抽象类,Calendar类无法直接创建对象使用,里边有一个静态方法叫getInstance(),该方法返回了canlendar类的子类对象。我们可以直接调用这个静态方法。static Calendar getInstance() 使用默认时区和语言环境获得一个日历。我们可以直接打印子类对象,...

2020-01-01 13:14:41 183

原创 JAVA中的System类

JAVA中的System类System是java.lang包下的类,只要是lang包下的类,我们就无需导包,可以直接使用。System类提供了大量的静态方法,可以获取与系统相关的信息或系统级操作常用方法:第一个方法作用:验证程序效率,比如验证佛如循环打印数字所需时间我们在程序执行前获取一次时间,执行后再获取一次,相减即可。第二个方法有五个参数:...

2020-01-01 13:10:45 167

原创 JAVA中的匿名内部类

JAVA中的匿名内部类在java的内部类当中,匿名内部类是用的最多的,匿名内部类是java8的新特性lambda表达式的重要前提。我们传统方式的实现接口:1.定义一个接口2.定义他的实现类3.父类引用指向子类对象(多态)如果接口的实现类(或者父类的子类)只需要使用唯一的一次。那么这种情况下就可以省略掉该类的定义,而改为使用匿名内部类。匿名内部类的定义格式:我们之前说过,接口...

2020-01-01 13:07:46 212

原创 JAVA中的匿名对象

匿名对象匿名对象就是只有右边的对象,没有左边的名字和赋值运算符。new 类名称();直接new上一个类名称。我们通常都是创建一个对象,往左边赋上一个地址值,匿名对象也创建了对象,但这个地址谁都没有交给。我们可以在他的后边.上一个东西这个地方要注意的是,每次new出来的东西,他都会在栈内存中开辟一个新的地址,这里的他的第三个new又是一个全新的地址,所以是null注意事项:匿名对象只能使...

2019-12-28 12:59:47 247

原创 线程和进程

进程:指一个内存中运行的应用程序,每个进程都有一个独立的运行空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行的基本单位 。硬盘:永久存储ROM内存:所有的应用程序都需要进入到内存中执行,临时存储RAM,所以说电脑内存越大,执行速度越快点击应用程序执行,进入到内存中,占用一些内存的来执行,进入到内存的程序我们就叫他进程!线程:线程是进程的一个执行单元,负责当前进...

2019-12-28 11:30:13 597

原创 集合Collection接口

集合Collection接口: 是所有单列集合的最顶层接口add()方法返回的意思是是否添加成功,添加动作是一定成功的。但是对于其他集合,添加不一定成功分为list接口和set接口List接口有序的(存储123,取出也是123),可以重复,有索引有索引,可以使用普通for循环遍历 **set接口无序不可重复** 没有索引,不能使用带索引的方法,不能使用普通for循环遍历哈希值...

2019-12-28 11:26:17 206

原创 Java中对象的创建详细步骤

1.在我们运行方法之前,方法区要最先有数据,方法区保存的是.class相关数据。.class数据包含成员变量,成员方法。2.程序先运行main方法,main方法要想运行,首先得进栈,即从方法区进入到栈内存中。main方法在栈内存中,逐行开始执行,首先创建了一个对象(Phone one),这个Phone one好比就是一个局部变量,对象名称其实就是一个变量名称。变量当然是用来保存一些内容的,名...

2019-12-28 11:08:18 360

原创 对面向对象的个人见解

在程序编程中两种为主流,一种是面向过程,另一种为面向对象。面向谁就说明重视谁,比如我们开一家餐馆,面向的是普通群众,他的菜肯定会便宜一些。面向过程:当需要实现一个功能的时候,每一个具体的过程都要亲力亲为,详细处理每一个细节。看重的是这个过程。面向对象:简单的两个字,偷懒。当需要实现一个功能的时候,不关心具体的步骤,而是找一个已经具有该功能的人,来帮我做事。将复杂的事情简单化,将我们从执行者变...

2019-12-28 11:04:58 322

原创 java中的内存划分

内存就是计算机中的内存条,如果要想运行,就必须开辟一块儿内存条java的内存需要划分为五个部分1.栈内存(Stack):存放的都是方法中的局部变量 局部变量:方法的参数,或者是方法内部的变量 作用域:一旦超出作用域,立刻从栈内存中消失2.堆内存(Heap): 凡是new(数组也是new出来的)出来的东西,都在堆当中。比如数组...

2019-12-28 11:02:27 293

原创 JAVA中,索引、数组作为参数返回值

我们访问数组元素的格式:数组名称【索引值】索引值:就是一个int数字,代表数组当中元素的编号索引值从0开始,一直到“数组的长度 - 1”为止所有的引用类型变量,都可以赋予一个null值空指针异常:数组必须进行new初始化才能使用其中的元素。如果只是赋值了一个null,没有new创建,将会发生空指针异常原因:忘了new我们使用一个数组作为方法参数的时候,是将名称当中的保存的地址值传递进...

2019-12-28 10:57:56 974 1

原创 Mybatis入参处理

Mybatis参数传递Mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc。采用ORM思想对象关系映射(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),简单的说:就是把数据库表和实体类及实体类的属性对应起来,让我们可以操作实现操作数据库表单参数传递1.如果只有一个参数,Mybatis不做任何特殊处理,可以直接取出...

2019-12-28 10:49:10 286

空空如也

空空如也

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

TA关注的人

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