- 博客(51)
- 收藏
- 关注
原创 操作系统用户态和内核态
用户态和内核态一、 用户态和内核态的概念?二、为什么需要用户态和内核态?三、用户态与内核态的切换?四、用户态和内核态的详细介绍?一、 用户态和内核态的概念?内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取二、为什么需要用户态和内核态?由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围
2021-03-25 23:40:12
1750
原创 maven 打包忽略checkstyle
maven 命令mvn clean package -Dcheckstyle.skip=true经常在打包时点了skip test来运行,但这样再去运行测试用例的话,会提示没有编译,应该改成-DskipTests区别:-DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。-Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。...
2020-12-01 22:03:17
3871
原创 HBase总结
HBase简介 http://hbase.apache.org/HBase是一个高可靠性、高性能、面向列、可伸缩、 实时读写的分布式数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Big...
2019-12-04 19:39:04
388
原创 MyBatis中#{}和${}的区别
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。$表示拼接sql串,通过{}表示拼接sql串,通过表示拼接sql串,通过{}可以将para...
2019-09-03 20:51:42
315
原创 Mybatis补充
Mybatis中使用的设计模式1)建造者模式Builder模式应用1: SqlSessionFactory的创建SqlSessionFactoryBuilder :SqlSessionFactory的构造器,用于创建SqlSessionFactory,采用了建造者模式Builder模式应用2:数据库连接环境Environment对象的创建2)工厂模式SqlSessionFactory:...
2019-09-03 20:41:52
219
原创 Mybatis插件原理(三)-- Mybatis分页插件简介
引言:上面两节我们已经了解了Mybatis插件原理,下面是一个Mybatis分页的插件,可以为以后我们自定义开发插件做参考。代码/** * Mybatis - 通用分页插件(如果开启二级缓存需要注意) */@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connecti...
2019-09-03 20:29:35
523
原创 Mybatis插件原理(一)-- 简单编写Mybatis插件
引言:当我们使用Mybatis的时候,总会使用到各种插件,如PageHelper(分页插件)等,当我们需要自定义插件来改变,就必须了解插件的实现原理。概述Mybatis插件又称拦截器,Mybatis采用责任链模式,通过动态代理组织多个插件(拦截器),通过这些插件可以改变Mybatis的默认行为。MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis允许使...
2019-09-03 20:24:30
11612
原创 Mybatis插件原理(二)-- Mybatis插件执行流程
引言:当我们使用Mybatis的时候,总会使用到各种插件,如PageHelper(分页插件)等,当我们需要自定义插件来改变,就必须了解插件的实现原理。概述Mybatis插件又称拦截器,Mybatis采用责任链模式,通过动态代理组织多个插件(拦截器),通过这些插件可以改变Mybatis的默认行为。MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis允许使...
2019-09-03 20:24:21
759
原创 Mybatis总结
1. 什么是 MyBatis ?MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。2. Mybat...
2019-09-03 16:35:45
182
原创 死磕Java多线程(十一)JUC常用工具类的简单介绍和使用
1. CountDownLatch在日常开发中经常会遇到需要在主线程中开启多个线程去并行执行任务,并且主线程需要等待所有子线程执行完毕后再进行汇总的场景。在CountDownLatch出现之前一般都使用线程的join()方法来实现这一点,但是join方法不够灵活,不能够满足不同场景的需要,所以JDK开发组提供了CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例...
2019-08-31 11:36:00
527
原创 死磕Java多线程(十)------JUC中相关原子操作类的简单使用
1. 常用的JUC下的原子操作类更新基本类型类:AtomicBoolean,AtomicInteger,AtomicLong更新数组类:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray更新引用类型:AtomicReference,AtomicMarkableReference,AtomicStampedReference更新字段...
2019-08-31 10:09:53
185
原创 死磕Java多线程 ---- 线程死锁
1. 什么是死锁?死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成互相等待的现象,在无外力作用的情况下,这些线程会相互等待而无法继续运行下去。线程T1已经持有了资源R1,他同时还想申请资源R2,与此同时,线程T2已经持有了资源R2,同时还想申请资源R1,所以线程T1和T2就因为相互等待对方已经持有的资源,而进入了死锁状态。2. 死锁产生的必要条件产生死锁必须同时满足以下四个条件...
2019-08-31 09:11:26
244
原创 Spring Data JPA 中findOne() 和 getOne()
引言:最近在使用SpringDataJPA做CRUD功能,在做到需要查询单个的功能的时候,我们发现SpringDataJPA为我们提供了两种办法findOne() 和 getOne(),那我们该如何选择呢,他们之间的区别又是什么呢,下面我们来总结一下findOne() 和 getOne()的区别1. 首先我们看一下Spring官方对他们的解释/** * Retrieves ...
2019-08-30 09:30:00
10581
原创 深入理解SpringIOC(三) ---- Spring如何解决循环依赖
引言1. 什么是循环依赖?当两个或多个bean出现相互引用且引用形成一个闭环的时候,就是循环依赖。例如ClassA中有ClassB,ClassB中有ClassC,ClassC中有ClassA,那么A->B->C-A就形成了一个闭环。注: 在Spring中一共有三种循环依赖,构造器循环依赖,Setter循环依赖,和Prototype作用域的循环依赖,对于这三种循环依赖,Spring...
2019-08-25 09:33:43
2785
5
转载 ioc源码分析(七)----refresh之initMessageSource方法
这个我也没用过,先记录下来,用的时候再说。。。。spring中初始化MessageSource组件 /** * 初始化此上下文的消息源。 * 如果没有在此上下文中定义,请使用父级。 */ protected void initMessageSource() { //获取工厂 ConfigurableListableBe...
2019-08-22 09:24:57
496
原创 ioc源码分析(三)----refresh之prepareBeanFactory方法
刷新BeanFactory后,开始执行prepareBeanFactory方法。这个方法是配置工厂的标准上下文特征。protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { //设置beanFactory的classLoader为当前context的classLoader bea...
2019-08-22 08:41:11
119
原创 SpringAop之JDK动态代理
java中动态代理主要有JDK和CGLIB两种方式。JDK和CGLIB区别主要是jdk是代理接口,而cglib是代理类。(别的没见过。。。)JDK动态代理jdk的动态代理调用了Proxy.newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h) 方法。通过该方法生成字节码,动态的...
2019-08-19 17:28:59
218
原创 浅谈spring事务失效之谜
spring事务失效5种大的原因如使用mysql且引擎是MyISAM,则事务会不起作用,原因是MyISAM不支持事务,可以改成InnoDB。如果使用了spring+mvc,则context:component-scan重复扫描问题可能会引起事务失败。@Transactional 注解开启配置,必须放到listener里加载,如果放到DispatcherServlet的配置里,事务也是不起作...
2019-08-19 10:44:03
325
1
原创 JVM-finalize()的简单介绍
引言:我们知道Java是自动回收对象的,而C、C++需要手动回收对象(析构函数),但是Java的垃圾回收机制并不是万能的,垃圾回收只能回收内存,而且只能回收内存中由Java创建对象方式(堆)创建的对象所占用的内存,无法回收其它资源,比如文件操作的句柄、数据库的连接、本地对象(通过JNI创建的对象)等,为了解决这个问题Java为我们提供了finalize这个方法来完成“非内存资源”的清理工作。f...
2019-08-16 23:16:16
464
原创 Mybatis逻辑分页与物理分页
当我们使用Mybatis实现分页操作时,我们需要注意Mybatis逻辑分页与物理分页这两个区别逻辑分页:将数据一次性从数据库查出到内存中,在内存中进行逻辑上的分页物理分页:直接特定的SQL语句,只从数据库中查询出需要的数据–> mybatis自带分页RowBounds: //逻辑分页业务逻辑代码public List<User> findUserByPage() {/...
2019-08-16 11:55:48
3714
原创 Mybatis-plus入门
最近发现一个超级好用的数据库框架Mybatis-plus, 功能真的强大,基本上都不用写什么代码了。。。。简介Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 Mybatis-Plus ------》 我们的愿景是成为Mybatis最好的搭档,就像 Contra Game 中的1P、2P,基...
2019-08-16 10:55:26
167
原创 Mysql进阶之路(九)---Mysql主从复制
Mysql主从复制原理master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件,同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志...
2019-08-16 00:00:37
217
原创 NIO总结(四) NIO之Pipe
首先给大家介绍下原理:Pipe就是个空管子,这个空管子一头可以从管子里往外读,一头可以往管子里写,并且是FIFO结构操作流程:首先要有一个对象往这个空管子里面写。写到哪里呢?这个空管子是有一点空间的,就在这个管子里。写的时候就是写到管子本身包含的这段空间里的。这段空间好像是1024个字节(根据需求设置)。然后另一个对象才能将这个装满了的管子里的内容读出来。简单例子...
2019-08-15 23:10:29
204
原创 NIO总结(三) NIO之Selector
引言:之前我们使用BIO进行socket编程时,accept方法会一直阻塞,直到有客户端请求的到来,并返回socket进行相应的处理。整个过程是流水线的,处理完一个请求,才能去获取并处理后面的请求,当然也可以把获取socket和处理socket的过程分开,一个线程负责accept,一个线程池负责处理请求。但NIO提供了更好的解决方案,采用选择器(Selector)返回已经准备好的socket,...
2019-08-15 23:03:08
467
2
原创 NIO总结(二) NIO之Channel
ChannelNIO把它支持的I/O对象抽象为Channel,Channel又称“通道”,类似于原I/O中的流(Stream),但有所区别:1、流是单向的,通道是双向的,可读可写。2、流读写是阻塞的,通道可以异步读写。3、流中的数据可以选择性的先读到缓存中,通道的数据总是要先读到一个缓存中,或从缓存中写入eg:使用FileChannel(一个用来写、读、映射和操作文件的通道)进行文件...
2019-08-15 19:19:46
245
原创 NIO总结(一) NIO之Buffer
引言:为什么会出现NIO?我们知道JDK很早就提供对IO操作-----BIO(同步阻塞IO),那为什么还要提供NIO呢?翻阅了一些资料以后,我觉得NIO出现的原因主要是为了解决BIO中不必要的线程上下文切换。下面我们以聊天室来解释:我们知道BIO是阻塞式IO,当服务端接受到一个Socket连接的时候,我们需要开一个线程来处理这个Socket连接中的网络请求(单线程是无法同时处理多个Socke...
2019-08-15 18:14:19
181
原创 IO模型(BIO,NIO,AIO)及其区别
同步、异步,阻塞、非阻塞概念io操作分为两部分,发起io请求,和io数据读写。阻塞、非阻塞主要是针对线程发起io请求后,是否立即返回来定义的,立即返回称为非阻塞io,否则称为阻塞io。同步、异步主要针对io数据读写来定义的,读写数据过程中不阻塞线程称为异步io,否则,称为同步io。BIO:同步阻塞IOBIO:线程发起io请求后,一直阻塞(阻塞io),直到数据就绪后,用户线程将数据写入s...
2019-08-15 11:50:15
553
原创 序列化与反序列化
1. 什么是序列化?java序列化是指把java对象转换为字节序列的过程,而java反序列化是指把字节序列恢复为java对象的过程序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存的java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。...
2019-08-15 11:02:53
128
原创 死磕Java多线程(六)---Volatile原理
引言:上节说到计算机的硬件组成可以抽象为由总线、IO设备、主存、处理器(CPU)等组成。其中数据存放在主存中,CPU负责指令的执行,CPU的指令执行非常快,大部分简单指令的执行只需要一个时钟周期,而一次主内存数据的读取则需要几十到几百个时钟周期,那么CPU从主存中读写数据就会有很大的延迟。这个时候就产生了高速缓存的概念。也就是说,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高...
2019-08-12 00:34:26
263
转载 死磕Java多线程(五)---理解CPU高速缓存的工作原理
我们说了Java内存模型是一个语言级别的内存模型抽象,它屏蔽了底层硬件实现内存一致性需求的差异,提供了对上层的统一的接口来提供保证内存一致性的编程能力。在一致性这个问题域中,各个层面扮演的角色大致如下:一致性模型,定义了各种一致性模型的理论基础硬件层,提供了实现某些一致性模型的硬件能力。硬件在默认情况下按照最基本的方式运行,比如对同一个线程没有数据依赖的指令可以重排序优化执行,有数据依赖...
2019-08-10 19:30:09
3742
原创 死磕Java多线程(一)---线程的简单介绍
引言以前对多线程的认识就只有new Thread 或 实现一个runnable接口,简单用用互斥锁(synchronized),线程间的通信(wait/notify)就没了,最近在复习多线程,就去网上看看大佬们的博客,才发现自己真的是井底之蛙,多线程都没入门,所以最近在拼命学习多线程,顺便总结一下,方便以后复习。。。。1. 线程的实现2.线程的六种状态3.多线程的优点更好的资源利...
2019-08-10 19:03:26
262
1
原创 死磕Java多线程(四)--- 指令重排、内存屏障、Happens-before
5.指令重排:执行代码时jvm会进行指令重排序,处理器为了提高效率,可以对输入代码进行优化,它不保证程序中各个语句的执行先后顺序同代码中的顺序一致,根据处理器特性(CPU多级缓存系统、多核处理器等)适当的对机器指令进行重排序,使机器指令能更符合CPU的执行特性,最大限度的发挥机器性能。...
2019-08-10 18:15:04
784
1
原创 死磕Java多线程(二)--- 多线程必须了解的三大特性
引言:我们都知道并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。下面让我们来看看原子性、可见性以及有序性到底是什么?可见性可见性指的是一个线程对变量的写操作对其他线程后续的读操作可见。由于现代CPU都有多级缓存,CPU的操作都是基于高速缓存的,而线程通信是基于内存的,这中间有一个Gap, 可见性的关键还是在对变量的写操作之后能够在...
2019-08-10 17:37:49
205
原创 Mysql进阶之路(七)---MySQL锁总结
引言锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。MySQL锁概述相对其他数据库而言,MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎支持不同的锁机制。...
2019-08-09 20:02:24
240
原创 Mysql进阶之路(五)--- Mysql事务隔离机制详述(MVCC总结)
引言:数据库的事务隔离级别相信很多同学都知道.MySQL默认的隔离级别为REPEATABLE READ(可重复读),其他大部分数据库的默认级别为READ COMMITTED(读已提交),但是大家有没有想过它是如何实现的呢?偷偷的翻了一些小本本后,先把我的理解写下来。。。。。一:事务隔离级别1, READ UNCOMMITTED(读未提交)事务中的修改,即使没有提交,对其它事务也是可见的. ...
2019-08-09 00:22:21
208
原创 Mysql进阶之路(四)---- Mysql事务详述之ACID的实现
引言:说起数据库事务,绕不开的就是两点,一个是事务的特性,另一个就是事务的隔离机制。每次复习数据库的时候,总会看到数据库特性有什么啊,不就是ACID嘛,A-原子性,C-一致性,I-隔离性,D-持久性。那么Mysql是基于什么玩意儿去保证它的呢,瞬间懵逼.。。。。。好了,不尴尬了,开始学习。。。总结:1. Redo log(保证持久性)Redo log叫做重做日志,主要用来实现事务的持久...
2019-08-08 23:13:21
228
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人