自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 mysql的常见函数

ABS(x):取绝对值 select ABS(-1.7):结果1.7CEIL(x):返回不小于x的最小正整数 select CEIL(5.6):返回6 select CEIL(5) 返回5FLOOR(x):返回不大于x的最大正整数 select FLOOR(5.6) RAND():返回0到1之间的随机数round(x):四舍五入,没有小数 round(x,y):四舍五入,保留y位小数truncate(x,y):截取x的y为小数 select truncate(5.3654,2)返回5.36sign(

2022-06-28 15:15:08 346 1

原创 某个类A方法调用B方法,aop不生效的原因

首先请思考一下以下代码执行的结果:LogAop.java//声明一个AOP拦截service包下的所有方法@Aspectpublic class LogAop { @Around("execution(* com.demo.service.*.*(..))") public Object log(ProceedingJoinPoint joinPoint) throws Throwable { try { MethodSignature metho.

2020-12-18 16:25:21 1217

原创 亲缘指数的计算

总体计算公式是:找到最近的共同的祖先,计算出两个人距离祖先的代数之和,然后计算1/2的代数之和次幂,再乘以共同祖先数量1,假设我和我表弟,首先找到我们共同的祖先,也就是我们的外公外婆,一共是2代,加起来是4代,然后一代是1/2,所以(1/2)的4次方是1/16,然而我们有两个祖先,外公外婆,所以乘以2也就是1/82,和自己的父母,是1/2,因为共同的祖先就是父母,一共是一代,也就是1/23,如果是同父同母的关系,那么一共的代数是2(1+1),然后1/2的2次方是1/4,由于我们有两个共同的祖先,

2020-12-10 14:37:45 1753 1

原创 编程式事物和申明式事物

通常都会用申明式事物,就是在方法上加上@Transactional(rollbackFor = Exception.class)但是在某些情况下我们要使用编程式事物,比如下面的代码,实际上编程式事物就是缩小事物的范围(不需要整个方法都加事物),原因是开启编程式事物之前对数据库有所更新,如果在一个事物中,那么获取到的值不是更新后的,而是旧的,可是我们想要获取到最新的,我举个例子,就是加入事物前的代码把某个表的某个字段的值从0改成1,如果用声明式事物,那么下面的代码获取到的还是0,而不是1,但是你想要

2020-12-02 15:33:42 188

原创 seata的一些理解

有三个组成部分:1,TC:事务协调器,是个独立的中间件,需要部署运行,维护着全局事务的运行状态,接收TM发起的全局事务的提交和回滚,负责和RM通信协调各个分支事务的提交和回滚2,TM:事务管理器,负责开启一个全局事务3,RM:控制分支事务,负责分支注册,并接收事务协调器TC的指令,拿新用户注册送积分来举例,有两个微服务,一个用户服务,一个积分服务具体的执行流程如下:1,用户服务的TM像TC申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的XID,2,用户服务RM向TC注册

2020-08-27 14:26:39 188

原创 volatile关键字

volatile关键字主要有三方面作用:1,实现long/double类型变量的原子操作2,防止指令重排序3,实现变量的可见性当使用volatile修饰变量时,应用就不会从寄存器中获取该变量的值,而是从内存(高速缓存)中获取它和锁类似的地方有两点:1,防止指令重排序2,实现变量的可见性对于volatile关键字变量的读写操作,本质上都是通过内存屏障来执行的,内存屏障兼具了两方面能力:1,防止指令重排序2,实现变量的可见性1,对于读取操作来说,volatile可以确

2020-08-22 15:14:09 100

原创 传统springmvc的容器初始化过程以及现代springboot容器初始化过程的一些差异和总结

传统的springmvc容器的初始化过程:1,通过SpringServletContainerInitializer来负责对容器启动时的相关组件的初始化,在web这个jar包下面有个meta-inf目录,下面有个services目录,下面有个javax.servlet.ServletContainerInitializer文件,里面指明了SpringServletContainerInitializer2,到底要初始化哪些组件是通过Servlet规范中所提供的注解handlesTypes来.

2020-08-15 09:22:30 525

原创 关于CyclicBarrier的底层执行流程

1,初始化CyclicBarrier中的各种成员变量,包括parties,count以及runnable(可选)2,当调用await方法时,底层会检查计数器是否已经归零,如果是的话,那么久首先执行可选的runnable,接下来开始下一个generation;3,在下一个分代中,将会重置count为parties,并且创建新的generation实例4,同时在调用Condition的signalAll方法,唤醒所有在屏障前等待的线程,让其开始继续执行5.如果计数器没有归零,那么当前的调用线程将

2020-08-14 13:18:10 116

原创 JDK1.5之前和之后实现方法同步的方式

在jdk1.5之前,我们想要实现线程同步,只能通过synchronized关键字这一种方式来达成,底层,JAVA也是通过synchronized关键字来做到数据的原子性的,synchronized关键字是jvm实现的一种内置锁,从底层角度来说,这种锁得获取和释放是由jvm帮助我们隐式实现的从jdk1.5开始,并发包引入了lock锁,lock同步锁是基于JAVA来实现的,因此锁的获取和释放都是通过JAVA代码来实现和控制的,然而synchronized是基于底层操作系统Mutex lock来实现的,每次对锁

2020-08-04 21:43:22 268

原创 java发送邮件

首先引入jar包: <dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.5.0-b01</version></dependency>代码:需要注意的是transport.connect()中的不是密码,而是授权码,163为例,去网页登录获取授权码,然后需要在设置里开启SMTP服...

2020-08-04 10:01:07 211

原创 jvm实现同步与自旋

jvm中的同步是基于进入与退出监视对象(管程对象,Monitor)来实现的,每个对象实例都会有一个Monitor对象,Monitor对象会和JAVA对象一同创建并销毁,Monitor对象是由c++来实现的当多个线程同时访问一段同步代码时,这些线程会被放到一个EntryList集合中,处于阻塞状态的线程都会被放到该列表中,接下来,当线程获取到对象的Monitor时,Monitor是依赖于底层操作系统的mutex lock来实现互斥的。线程获取mutex成功,就会持有该mutex,这时其他线程无法再获取如果

2020-08-03 21:51:03 199

原创 synchronized方法

对于synchronized关键字修饰方法来说。并没有出现monitorenter和monitorexit指令。而是出现了一个ACC_SYNCHRONIZED标志。jvm使用这个标志区分一个方法是否为同步方法,当方法被调用,调用指令会检查方法是否有该标志,如果有,那么执行线程将会先持有方法所在对象的的monitor对象,然后再去执行方法体,在方法执行期间,其他任何线程均无法再获取到这个monitor对象,当线程执行完该方法后。它会释放掉这个mo...

2020-08-03 21:35:54 126

原创 wait,notify,notifyall方法的总结

wait方法:在调用该方法时候,线程必须持有调用对象的锁,当调用后,线程就会释放该对象的锁,在调用thread的sleep方法的时候。线程是不会释放对象的锁的。关于wait,notify和notifyall方法的总结:1,当调用wait时,首先需要确保调用了wait方法的线程已经持有了对象的锁2,当调用wait后。该线程就会释放掉对象的锁,然后进入等待状态(waitset)3,当线程调用了wait后进入到等待状态时,它就可以等待其他线程调用相同对象的notify或者notifyall方法来使得自己被

2020-08-03 21:23:07 169

原创 CountDownLatch的一些理解

CountDownLatch概念CountDownLatch是一个同步工具类,用来协调多个线程之间的同步。CountDownLatch能够使主线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经执行完毕,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。final CountDownLatch countDownLatch = new

2020-07-31 18:00:20 199

原创 springmvc的HandlerInterceptorAdapter

preHandle:会在请求到达控制器前被调用。 postHandle:在方法执行后调用,(调用了Service并返回ModelAndView,但未进行页面渲染),有机会修改ModelAndView afterCompletion:在整个请求处理完毕后进行回调,也就是说视图渲染完毕或者调用方已经拿到响应。...

2020-05-28 14:34:12 153

原创 eclipse查看class文件

window-->show View-->Navigator然后在bin目录下,就可以看到class文件了

2020-05-28 09:44:27 597

原创 CommandLineRunner和ApplicationRunner接口

业务场景:应用服务启动时,加载一些数据和执行一些应用的初始化动作。如:删除临时文件,清除缓存信息,读取配置文件信息,数据库连接等。1、SpringBoot提供了CommandLineRunner和ApplicationRunner接口。当接口有多个实现类时,提供了@order注解实现自定义执行顺序,也可以实现Ordered接口来自定义顺序。注意:数字越小,优先级越高,也就是@Order(va...

2020-05-28 09:44:04 188

原创 Filter和ZuulFilter

Filter是属于servlet提供的,位于servlet包下面,继承该接口,复写doFilter方法,可实现过滤,而ZuulFilter是zuul包下面的,继承该抽象类,复写run方法,前者比后者先执行

2020-05-28 09:43:18 1655 3

原创 springboot执行流程

SpringApplication.run(JvmStudyApplication.class, args);当我们这样执行一个run方法的时候,首先会构造一个springApplication,然后再去启动run方法构造SpringApplication的过程:1,设置webApplicationType,判断应用类型,这是springboot的一个成员变量,通过判断jar包里有...

2020-04-06 14:38:34 776

原创 指定java -jar命令来执行一个jar文件的时候的流程

我们可以通过maven build来把一个springboot项目打包成一个jar文件,然后 用java -jar jar文件名的方式启动这个项目,这个jar文件是个压缩文件,解压后有三个根目录:BOOT-INF:下面有两个子目录,分别是lib和classes,lib里面是第三方依赖的jar包,classes里面是项目里面的类信息META-INF:里面有一个清单文件MANIFEST.MF文...

2020-04-05 22:07:47 659

原创 Proxy.newProxyInstance方法

System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");ProxyGenerator类中定义了此方法的第一个参数是什么在调用newProxyInstance之前将sun.misc.ProxyGenerator.saveGeneratedFiles系统属性设置为true,生成的代理...

2020-04-03 16:52:34 1015

原创 System.getProperty()可以获取的值

java.version:Java 运行时环境版本java.vendor:Java 运行时环境供应商java.vendor.url:Java 供应商的 URLjava.home:Java 安装目录java.vm.specification.version:Java 虚拟机规范版本java.vm.specification.vendor:Java 虚拟机规范供应商java.v...

2020-04-03 14:47:14 137

原创 CMS收集器

以获得最短回收时间为目标,多数应用于互联网站或者b/s系统的服务器端上基于“标记-清除”算法实现的,整个过程分为4个步骤:初始标记并发标记重新标记并发清除1,其中初始标记,重新标记这两个步骤仍然需要 STW2,初始标记只是标记一下GC Roots能直接关联到的对象,速度很快3,并发标记阶段是进行GC Roots Tracing的古城4,重新标记阶段是为了修正并...

2020-03-14 14:15:51 152

原创 JVM内存泄漏的原因

1,对象定义在错误的范围以下代码:如果Foo实例对象的生命较长,会导致临时性内存泄漏,class Foo{private String [] names;public void doIt(int length){names=new String[length]print(name)}}JVM喜欢生命周期短的对象,class Foo{public voi...

2020-03-09 15:09:29 162

原创 垃圾收集器

Serial收集器:单线程收集器,收集时会暂停所有工作线程(stop the world,简称STW),使用复制收集算法,虚拟机运行在client模式时的默认新生代收集器,最早的收集器,新生代和老年代都可以使用,在新生代采用复制算法,在老年代,采用标记整理算法,因为是单线程,没有多线程切换的额外开销。ParNew收集器:这是Serial的多线程版本,除了使用多个收集线程外,其余行为包括算法,S...

2020-03-08 20:15:20 92

原创 垃圾判断算法,GC算法,gc时机,垃圾收集器的并行和并发

堆是gc的主要工作区域,为了高效的gc,会把堆细分更多的子区域public void method1(){ Object obj=new Object();}1,生成了2部分的内存区域,1)obj这个引用变量,因为是方法内的变量,放到jvm stack里面(栈帧的局部变量表),2)真正object class的实例对象,放到heap里面2,上述的new语句一共消耗12个b...

2020-03-08 19:52:31 309

原创 栈帧和静态解析,动态分派

栈帧:栈帧是一种用于帮助虚拟机执行方法调用与方法执行的数据结构,栈帧本身是一种数据结构,封装了方法的局部变量表,动态链接信息,方法的返回地址以及操作数栈等信息符号引用,直接引用:有些符号引用是在类加载阶段或是第一次使用时就会转换为直接引用,这种转换叫静态解析,另外一些符号引用则是在每一次运行期转换为直接引用,这种转换是动态链接,这体现在java的多态性静态解析的4种解析:...

2020-02-15 20:22:16 239

原创 this关键字和异常处理方式

1,对于java类中的每一个实例方法(非static方法),其在编译后,所生成的字节码当中,方法参数的数量总是会比源代码中方法多一个(this),它位于方法的第一个参数位置处,这样,我们就可以在java的实例方法中使用this来访问当前对象的属性以及方法2,这个操作是编译期完成的,即由javac编译器在编译时候将对this的访问转化为对一个普通实例方法参数的访问,接下来运行期,由jvm在调用实...

2020-02-15 20:17:11 138

原创 字节码整体结构和数据结构

1,magic number(魔数),4个字节,值为OxCAFEBABE2,version(版本号)2+2个字节3,constant pool(常量池)2+n个字节4,Access flags访问标志信息,包括该class文件是类还是接口,是否被定义为public,是否是abstract和final,2个字节5,this className 当前类的名称,2个字节6,super...

2020-02-15 20:10:48 188

原创 字节码文件

1,使用javap -verbose命令解析一个字节码文件时候,将会分析该字节码文件的魔数,版本号,常量池,类的构造方法,类中的方法信息,类变量与成员变量等信息2,魔数:所有的.class字节码文件的前4个字节都是魔数,为固定值:OxCAFEBABE3,魔数之后的4个字节是版本信息,前两个字节表示此版本号,后两个字节表示主版本号4,常量池(constant pool):紧接着主版本号之...

2020-02-15 20:01:09 127

原创 final关键字

常量在编译阶段会存入到调用这个常量的方法所在的类的常量池中本质上,调用类并没有直接引用到定义常量的类,因此并不会触发定义常量的类的初始化执行结果:hello world注意:这里指的是将常量存放到了MyTest2的常量池中,之后MyTest2和MyParent2就没有任何关系了,甚至可以把myparent2的class文件删除。但是1)如果把final去掉,那么就是对mypar...

2020-01-14 18:11:12 115

原创 volatile关键字

volatile关键字,使一个变量在多个线程间可见,A,B线程都用一个变量,java默认是A线程中保留一份copy。这样如果b线程修改了该变量,则a未必知道使用volatile关键字,会让所有线程都会读到变量的修改值。在下面的代码中,running是存在堆内存的t对象中,当线程t1开始运行的时候,会把running值从内存中读到t1线程的工作区,在运行过程中直接使用这个copy,并...

2020-01-14 18:03:52 72

原创 类的加载,链接与初始化

在java代码中,类型的加载,链接,和初始化都是在程序运行期间完成的1,加载:加载类的class文件中的二进制数据到内存中,把它放在运行时数据区的方法区中,并且在内存中创建一个java.lang.class对象,用来封装类在方法区中的数据结构加载class文件的方式: 1)从本地系统中直接加载 2)通过网络下载class文件 3)从zip,jar等...

2020-01-14 17:44:32 581

原创 设置开机自动启动,和自启动浏览器,自动全屏访问某个url

1,打开C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp2,谷歌浏览器桌面快捷方式右键属性,在目标选项卡后面加 --kiosk www.baidu.com 注:www.baidu.com是访问的url,--前面要加空格,点击确定3,把快捷方式复制到1的目录下ok了,重启电脑,就能自动进入浏览器,全屏进入指定的地址,...

2019-05-23 10:31:31 11317

原创 mysql GROUP_CONCAT和CONCAT_WS函数使用

CONCAT_WS函数:是将两个字段拼接在一起,或者多个吧,第一个参数是拼接的分割符,后面的参数是要拼接的字段名,很简单,函数里面可以嵌套函数的GROUP_CONCAT:重点是想记录这个函数,里面可以排序,GROUP_CONCAT(),一个参数的话,就是字段名后面写orderby字段名,两个参数就是指定分隔符,第二个参数是分隔符,分隔符后面写orderby字段名,ordersele...

2019-05-10 12:14:01 539

原创 excel怎么查看一共有多少列

文件>>选项>>常规与保存>>勾选R1C1引用样式

2019-05-07 18:13:59 8104

原创 svn切换账号

1.桌面右键点击tortoiseSVN&gt;&gt;&gt;settings&gt;&gt;&gt;saved data&gt;&gt;&gt;authentication data2.点击authentication data后面的clear,弹出窗口,选中,ok,就行了3.再次访问svn,update或者commit什么的就会重新输入账号密码了...

2019-02-18 12:01:05 1883

原创 进程显示PID方法

有时候需要知道pid我们才能知道结束某个进程,方法  进入任务管理器-进程  然后点击导航栏上面的查看,选择选择列,把pid打上钩就行了,需要注意的是,win10的电脑在查看下面没有选择列这个选项,这个就更简单,只需要在列名的地方右键,选择pid就行了...

2018-12-04 22:35:52 1570

空空如也

空空如也

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

TA关注的人

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