![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java基础
文章平均质量分 86
IT_小白鼠
good good study!
day day up!
展开
-
零拷贝技术原理与使用
上下文切换(context-switch)指的是内核(操作系统的核心)在CPU上对进程或者线程进行切换。上下文切换过程中的信息被保存在进程控制块(PCB-Process Control Block)中。PCB又被称作切换帧(SwitchFrame)。上下文切换的信息会一直被保存在CPU的内存中,直到被再次使用。进程上下文切换线程上下文切换中断上下文切换。原创 2023-07-09 23:20:49 · 392 阅读 · 0 评论 -
Java并发编程之synchronized关键字解析
前言公司加班太狠了,都没啥时间充电,这周终于结束了。这次整理了Java并发编程里面的synchronized关键字,又称为隐式锁,与JUC包中的Lock显示锁相对应;这个关键字从Java诞生开始就有,称之为重量级锁,自从JDK1.6之后官方对该关键字进行优化,引入了轻量级锁和偏向锁,于是就有了锁升级的概念。使用在代码中使用这个关键字总共有以下三种: private static Object object = new Object(); private syn...原创 2022-03-13 17:37:54 · 559 阅读 · 0 评论 -
ThreadLocal原理解析以及是否需要调用remove方法
平常的开发过程中,如果有个类不是线程安全的,比如SimpleDateFormat,要使这个类在并发的过程中是线程安全的,那么可以将变量设置位局部变量,不过存在的问题就是频繁的创建对象,对性能和资源会有一定降低和消耗;那么这里就可以用到ThreadLocal作为线程隔离,那么ThreadLocal是如何实现线程与线程之间隔离的呢,待会儿会在下文进行讲解。之前有篇使用ThreadLocal做线程之间的隔离实例,大家可以参考一下:使用ThreadLocal实现Mybatis多数据源在了解ThreadLoc原创 2021-08-27 11:16:42 · 2458 阅读 · 0 评论 -
Spring集成Mybatis多数据源配置
既然在整理Mybatis那就把经常用的这个多数据源的笔记也整一下吧。Spring集成Mybatis在之前就已经提到了。Spring集成Mybatis集成Mybatis多数据源有两种方式:1、创建多个SqlSessionFactory,扫描每个SqlSessionFactoryBean对应的包,形成了每个Factory对应一个数据源。2、创建一个SqlSessionFactory,通过动态切换数据源对象,达到多数据源操作功能。第一种方式通过在Spring的配置文件中配置多个SqlSes原创 2021-06-28 16:13:38 · 1677 阅读 · 0 评论 -
Mybatis源码之插件模块分析
总结完这个Mybatis的整体主要功能基本上就差不多完,还有一些细节的部分,后续都会记录补充。插件这个东西一般用的比较少,就算用的多的插件也算是PageHelper分页插件;PageHelper官网:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md官网上这个也有谈到Mybatis的插件流程分析。使用示例插件类记录SQL执行的时间,1、在JDK8之前必须实现Interceptor接口中原创 2021-06-14 16:02:05 · 119 阅读 · 0 评论 -
Mybatis源码之与Spring集成包
这次讲讲Mybatis与Spring的整合,作为两款优秀的开源框架,被大众广泛使用,自然是需要强强联合的。使用示例先看一下怎么使用,首先需要引用这两款框架的jar包:<dependency> //spring-webmvc会自动去引入其他Spring的核心包 <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <原创 2021-06-13 18:51:57 · 304 阅读 · 0 评论 -
Mybatis源码之核心流程分析
终于谈到了Mybatis最核心的东西了,最核心的就是通过配置XML文件或注解中的SQL,直接调用接口就能执行配置好的SQL语句并封装成对应的返回类型的数据。先看一下Mybatis使用示例://创建Builder对象SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//读取配置文件IO流InputStream is = Resources.getResourceAsStream("mybatis/mybatis-原创 2021-06-12 15:33:59 · 208 阅读 · 5 评论 -
Mybatis源码之缓存模块分析
缓存这个东西在很多应用中都能看到它们的身影,这次就讲讲在Mybatis中的缓存是怎么应用的,虽然说吧Mybatis中的缓存基本不怎么用,用的更多是第三方组件redis、MongoDB、MemCache等等。Mybatis的缓存是基于Map实现的,从缓存中读写数据是缓存模块的核心功能,但是除了这个功能Mybatis也提供了很多附加功能,比如防止缓存击穿、添加缓存清空策略等等,并且这些附加的功能属性可以随意组合到核心功能上。缓存在Mybatis中的使用介绍Myabtis中有两个缓存,一级缓存以及二级原创 2021-06-07 19:46:26 · 150 阅读 · 3 评论 -
Mybatis源码之数据源模块分析
先来看看java纯jdbc查询数据的示例:try { //加载对应的驱动类 Class.forName("com.mysql.cj.jdbc.Driver"); //创建连接 Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC", "root", "root123"); String sql = "select * from原创 2021-06-06 13:06:02 · 194 阅读 · 0 评论 -
Mybatis源码日志模块分析
看源码需要先下载源码,可以去Mybatis的github上的仓库进行下载,Mybatis这次就先整理一下日志这一块的源码分析,这块相对来说比较简单。之前的文章有谈到过Java的日志实现,大家也可以参考一下:日志实现以及使用...原创 2021-06-02 14:14:39 · 245 阅读 · 2 评论 -
Mybatis配置文件参数定义
大家也可以上官网看,官方文档转载 2021-06-01 13:55:43 · 822 阅读 · 0 评论 -
MongoDB位运算基本使用以及位运算应用场景
在MongDB的V3.2版本以后才支持的位运算,在这个版本之前是不支持,所以想要用位运算,需先将MongoDB的版本升级至V3.2说明在官方文档中共支持四种&位运算条件$bitsAllClear 所有指定二进制的位数都为0 $bitsAllSet 所有指定二进制的位数都为1 $bitsAnyClear 任意一位指定二进制的位数为0 $bitsAnySet 任意一位指定二进制的位数为1 这个指定的位数是不是有点难以理解例如255这个数字的二进制有原创 2021-05-19 17:06:28 · 1619 阅读 · 1 评论 -
Spring AOP两种使用方式以及如何使用解析
AOP是一种面向切面编程思想,也是面向对象设计(OOP)的一种延伸。在Spring实现AOP有两种实现方式,一种是采用JDK动态代理实现,另外一种就是采用CGLIB代理实现,Spring是如何实现的在上篇已经讲到了Spring Bean的生命周期以及IOC源码解析AOP可以做日志记录,或者事务回滚,在Spring的事务使用就是通过AOP进行事务的回滚的JDK动态代理这个是属于JDK提供的一种代理方式,需提供接口才能使用,主要用的类有两个:1、Proxy:这个主要是生成接口代理对象;2、Inv原创 2021-05-07 13:57:57 · 278 阅读 · 1 评论 -
Java并发编程之线程定时器ScheduledThreadPoolExecutor解析
定时器就是需要周期性的执行任务,也叫调度任务,在JDK中有个类Timer是支持周期性执行,但是这个类不建议使用了。ScheduledThreadPoolExecutor继承自ThreadPoolExecutor线程池,在Executors默认创建了两种:newSingleThreadScheduledExecutor:只包含一个线程,只需要单个线程执行周期任务,保证顺序的执行各个任务。newScheduledThreadPool: 可以包含多个线程的,线程执行周期任务,适度控制后台线程数原创 2021-05-01 14:07:33 · 2981 阅读 · 0 评论 -
Java并发编程之线程池ThreadPoolExecutor解析
线程池存在的意义平常使用线程即new Thread()然后调用start()方法去启动这个线程,但是在频繁的业务情况下如果在生产环境大量的创建Thread对象是则会浪费资源,不仅增加GC回收压力,并且还浪费了时间,创建线程是需要花时间的;线程池的存在就是降低频繁的创建线程,降低资源的消耗以及创建时间的浪费,并且可以同一管理。ThreadPoolExecutor在JDK中所有的线程池的父类就是ThreadPoolExecutor,以下是它的构造方法 /** * Creat原创 2021-05-01 10:58:29 · 220 阅读 · 0 评论 -
Java并发编程之堵塞队列介绍以及SkipList(跳表)
堵塞队列先了解一下生产者消费者模式:生产者就是生产数据的一方,消费者就是消费数据的另一方。在多线程开发中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这种生产消费能力不均衡的问题,便有了生产者和消费者模式。生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题,即有了MQ(Message Queue)中间件。生产者和消费者彼此之间不直接通信,而是通过阻塞队列来进行通原创 2021-04-30 22:23:41 · 364 阅读 · 1 评论 -
Java并发编程之并发容器ConcurrentHashMap(JDK1.8)解析
这个版本ConcurrentHashMap难度提升了很多,就简单的谈一下常用的方法就好了主要数据结构1.8将Segment取消了,保留了table数组的形式,但是不在以HashEntry纯链表的形式储存数据了,采用了链表+红黑树的形式储存数据;在使用get()方法时,使用纯链表的时间复杂度时O(n),而在使用红黑树的数据结构时,时间复杂度为O(logn),在查询的速度上有很大的提升;但是在创建的时候并非直接使用红黑树储存数据,而是依旧采用链表存储,但是但链表的长度超过8的时候就会转换成红黑树数据结构原创 2021-04-27 14:29:05 · 274 阅读 · 0 评论 -
Java并发编程之并发容器ConcurrentHashMap(JDK1.7)解析
最近看了一下ConcurrentHashMap的相关代码,感觉JDK1.7和JDK1.8差别挺大的,这次先看下JDK1.7是怎么实现的吧哈希(hash)先了解一下啥是哈希(网上有很多介绍),是一种散列函数,简单来说就是将输入值转换为固定值的一种压缩映射,在Java中最常见的就是Object.hashCode(),通过固定算法计算出来的一个值...原创 2021-04-18 21:55:57 · 172 阅读 · 0 评论 -
Java并发编程之FutureTask源码解析
上次总结一下AQS的一些相关知识,这次总结了一下FutureTask的东西,相对于AQS来说简单好多呀之前提到过一个LockSupport的工具类,也了解一下这个工具类的用法,这里也巩固一下吧 /** * Makes available the permit for the given thread, if it * was not already available. If the thread was blocked on * {@code park} t原创 2021-04-09 13:32:04 · 177 阅读 · 0 评论 -
Java并发编程之AbstractQueuedSynchronizer(AQS)源码解析
自己一个人随便看看源码学习的心得,分享一下啦,不过我觉得还是建议去买本Java并发编程的书来看会比较好点,毕竟个人的理解有限嘛,好啦进入整体啦。独占锁和共享锁首先先引入这两个锁的概念:独占锁即同一时刻只有一个线程才能获取到锁,Lock的实现类中ReentrantLock和WriteLock就是独占锁,所以独占锁也叫排它锁;共享锁是同一时刻多线程能获取到的锁叫共享锁,即ReadLock;在读写锁共有的情况下,会出现共存的情况即读-读共存,读-写、写-写不能共存,他们会产生互斥。数据结构.原创 2021-04-08 16:34:14 · 257 阅读 · 7 评论 -
Java并发编程之显式锁(Lock)使用
又是一个基于AQS好用的类,看来下次有必要看看AQS了,正好又是放假。既然叫显式锁,必然也有隐式锁,也就是所谓的synchronzied关键字,它们两者的区别呢在于使用范围,synchronzied关键字的使用范围比Lock要小,在Lock的实现类中与synchronzied相近似的类叫ReentrantLock,也叫可重入锁,待会儿在说看看Lock吧Lock是一个接口,主要的实现类有三个 ReadLock(写锁),WriteLock(读锁),ReentrantLock(可重入锁)核心方法:原创 2021-04-04 11:33:44 · 427 阅读 · 0 评论 -
Java线程CAS原子操作
这次分享一些关于CAS东西!!!定义CAS(Compare And Swap)是CPU的一个指令级别的操作,叫原子操作,原子操作是不可分割的,跟事务差不多,要么全部执行完成,要么不执行;像这种操作有点类似阻塞锁机制,但是使用阻塞锁机制去控制的话,会比较消耗性能,而使用CAS操作的话会比使用锁更快。与synchronized性能比较,最简单的一个测试Demopublic class AtomicNumber { AtomicInteger ai = new AtomicIntege原创 2021-04-03 20:50:05 · 114 阅读 · 0 评论 -
Java线程并发常用工具类使用
这次整理了一些比较常用的线程工具类啦。CountDownLatch:在一组线程执行完后,才能开始执行调用等待的线程。上片文章提到过junit的测试尽量不要测试线程,如果硬是要可以使用CountDownLatch进行测试CyclicBarrier:在一组线程中调用等待方法后,只有这组所有线程都进入等待后,会执行一个指定的线程,在指定的线程执行完后,这组等待的线程才能继续执行。Semaphore:可用于限流使用。Exchanger:当两组线程都执行到交换的方法时,能将数据在这两个线程之间进行数据原创 2021-04-02 20:19:26 · 229 阅读 · 0 评论 -
Java线程Fork/Join思想及实现
最近在看线程这一块的东西,所以之前的那篇文章就是用来记录的,但看起来好简单的样子,哈哈哈!这两天看的是Fork/Join分而治之的思想,Doug Lea大师的JUC还是挺强的,学并发编程应该没有人不知道这个大佬吧!上篇少记录了一个东西,叫守护线程,即Thread.setDaemon(boolean on);当参数为false的时候,没有意思,当参数为true的时候,即调用该方法的线程与当前的线程共生死,就是当前线程结束了后无论调用setDeamon(true)的线程是否结束,它都会结束;这个这么看.原创 2021-04-02 14:03:57 · 246 阅读 · 0 评论 -
Java线程的使用及共享协作
创建线程的三种方式1、继承Thread;static class MyThread extends Thread{ @Override public void run() { //do something... }}public static void main(String[] args) throws InterruptedException { MyThread thread = new MyThread (); thread.start();}原创 2021-03-26 14:27:15 · 102 阅读 · 0 评论 -
SpringMvc异步请求的使用及部分原理
最近隔壁项目组的项目又出问题了,一直被用户投诉太卡了,页面白屏的那种,打开源代码一看,全是非异步请求,类似于以下写法: @ResponseBody @RequestMapping(value = "/getTest") public String getTest() { System.out.println("主线程"+Thread.currentThread().getName()+"=>"+System.currentTimeMillis()); try { Thread.原创 2020-06-21 15:01:05 · 1007 阅读 · 0 评论 -
java框架mybatis配置文件总结一
先新建个java EE的项目该配置文件必须在src的目录下面, 新建一个xml 文件:建完后发现它会自动建在web目录下面,我们把这个文件移到src目录下面:(注:对了,该文件的编码最好用utf-8的no bom,该编码是用来文件开头的那三个字符,建议去网上了解一下)在idea设置该编码:file->setting->editor->file encondin...原创 2018-09-03 16:27:38 · 151 阅读 · 0 评论 -
常用集合(List,Set,Map)的基本定义和操作
集合类存放于java.util包中。集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。常用的集合类型主要有3种:set(集)、list(列表)和map(映射)。通俗的说,集合就是一个放数据的容器,准确的说是放数据对象引用的容器。Collection 集合的根接口------| List 如果是实现了Li...原创 2018-09-03 10:09:48 · 3366 阅读 · 0 评论