- 博客(61)
- 资源 (6)
- 收藏
- 关注
原创 Mybatis执行流程源码分析
第一部分:项目结构user_info表:只有id和username两个字段User实体类:public class User { private String username; private String password; public String getUsername() { return username; } ...
2020-12-13 16:54:00
203
原创 java并发之CopyOnWriteArrayList
我在前面总结了Java集合中ArrayList的源码细节,其中也提到了ArrayList是线程不安全的(没有做任何的同步保证),也说到了fast-fail机制以及多线程下使用ArrayList的异常问题。当然也包括单线程下使用不当:这里主要体现在使用增加for循环遍历的时候在循环体内进行add/remove操作导致的modCount和ArrayList的迭代器中expectModCount值不...
2019-08-04 17:04:00
242
原创 java并发之ConcurrentLinkedQueue源码分析
在并发编程中,我们可能经常需要用到线程安全的队列,JDK提供了两种模式的队列:阻塞队列和非阻塞队列。阻塞队列使用锁实现,非阻塞队列使用CAS实现。ConcurrentLinkedQueue是一个基于链表实现的无界线程安全队列,对于。下面看看JDK是如何使用非阻塞的方式来实现线程安全队列ConcurrentLinkedQueue的。成员属性 ConcurrentLinkedQueue由head...
2019-08-03 19:41:00
213
原创 LinkedList源码分析(jdk1.8)
LinkedList概述 LinkedList 是 Java 集合框架中一个重要的实现,我们先简述一下LinkedList的一些特点:LinkedList底层采用的双向链表结构;LinkedList支持空值和重复值(List的特点);LinkedList实现Deque接口,具有双端队列的特性,也可以作为栈来使用;LinkedList存储元素过程中,无需像 ArrayList 那样进行...
2019-08-02 17:38:00
167
原创 面试必问之ArrayList
ArrayList概述(1)ArrayList 是一种变长的集合类,基于定长数组实现。(2)ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,其会通过扩容机制重新生成一个更大的数组。(3)ArrayList 底层基于数组实现,所以其可以保证在 O(1) 复杂度下完成随机查找操作。(4)ArrayList 是非线程安全类,并发环境下,多个...
2019-08-01 17:11:00
163
原创 HashMap源码分析(jdk7)
HashMap的结构图示 jdk1.7的HashMap采用数组+单链表实现,尽管定义了hash函数来避免冲突,但因为数组长度有限,还是会出现两个不同的Key经过计算后在数组中的位置一样,1.7版本中采用了链表来解决。 从上面的简易示图中也能发现,如果位于链表中的结点过多,那么很显然通过key值依次查找效率太低,所以在1.8中对其进行了改良,采用数组+链表+红黑树来实现,当链表长度超过阈值...
2019-07-31 19:23:00
181
原创 深入理解Java中的AQS
AQS概述 AbstractQueuedSynchronizer抽象队列同步器简称AQS,它是实现同步器的基础组件,juc下面Lock的实现以及一些并发工具类就是通过AQS来实现的,这里我们通过AQS的类图先看一下大概,下面我们总结一下AQS的实现原理。先看看AQS的类图。 (1)AQS是一个通过内置的FIFO双向队列来完成线程的排队工作(内部通过结点head和tail记录队首和队尾元素...
2019-07-31 10:24:00
165
原创 深入理解HashMap
HashMap的结构图示 本文主要说的是jdk1.8版本中的实现。而1.8中HashMap是数组+链表+红黑树实现的,大概如下图所示。后面还是主要介绍Hash Map中主要的一些成员以及方法原理。 那么上述图示中的结点Node具体类型是什么,源码如下。Node是HashMap的内部类,实现了Map.Entery接口,主要就是存放我们put方法所添加的元素。其中的next就表示这可以构成一...
2019-07-24 11:07:00
164
原创 Java中的反射机制和动态代理
Java中的反射机制和动态代理 一、反射概述 反射机制指的是Java在运行时候有一种自观的能力,能够了解自身的情况为下一步做准备,其想表达的意思就是:在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为...
2019-06-16 14:06:00
280
原创 从同步原语看非阻塞同步以及Java中的应用
非阻塞同步:基于冲突检测的乐观并发策略,通俗讲就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了,如果争用数据有冲突那就采用其他的补偿措施(最常见的就是不断重试直到成功),这种乐观的并发策略使得很多线程不需要因为竞争失败直接挂起,这种同步措施称为非阻塞同步。下面我们就从硬件原语开始了解非阻塞同步,并看一看在Java中非阻塞同步的一些应用。一、从硬件原语上理解同步(非特指...
2019-06-15 16:43:00
219
原创 Java中的ThreadLocal详解
Java中的ThreadLocal详解 一、ThreadLocal简介 多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方...
2019-06-14 11:34:00
429
原创 Java并发包中线程池ThreadPoolExecutor原理探究
Java并发包中线程池ThreadPoolExecutor原理探究 一、线程池简介 线程池的使用主要是解决两个问题:①当执行大量异步任务的时候线程池能够提供更好的性能,在不使用线程池时候,每当需要执行异步任务的时候直接new一个线程来运行的话,线程的创建和销毁都是需要开销的。而线程池中的线程是可复用的,不需要每次执行异步任务的时候重新创建和销...
2019-06-12 01:07:00
147
原创 Java中的线程协作之Condition
Java中的线程协作之Condition 一、Condition接口1、Condition接口的常用方法介绍 1 /** 2 * 已经获取到锁的线程调用该方法会进入等待状态,知道其他持有锁的线程通知(signal)等待队列中的线程或者被中断退出等待队列; 3 * 如果该线程已经从该方法中返回,表名线程已经获取到了Condit...
2019-04-17 09:23:00
156
原创 Java中的读写锁
Java中的读写锁 一、读写锁1、初识读写锁 a)Java中的锁——Lock和synchronized中介绍的ReentrantLock和synchronized基本上都是排它锁,意味着这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,在写线程访问的时候其他的读线程和写线程都会被阻塞。读写锁维护一对锁(读锁...
2019-04-17 09:18:00
139
原创 Java中的锁——读写锁和Condition接口
Java中的锁——读写锁和Condition接口 Java中的队列同步器AQS;Java中的锁——Lock和synchronized一、读写锁1、初识读写锁 a)Java中的锁——Lock和synchronized中介绍的ReentrantLock和synchronized基本上都是排它锁,意味着这些锁在同一时刻只允许一个线程进行访问...
2019-04-15 20:40:00
696
原创 Java中的锁——Lock和synchronized
Java中的锁——Lock和synchronized 上一篇Java中的队列同步器AQS一、Lock接口1、Lock接口和synchronized内置锁a)synchronized:Java提供的内置锁机制,Java中的每个对象都可以用作一个实现同步的锁(内置锁或者监视器Monitor),线程在进入同步代码块之前需要或者这把锁,在退出同...
2019-04-14 22:36:00
219
原创 Java中的队列同步器AQS
一、AQS概念 1、队列同步器是用来构建锁或者其他同步组件的基础框架,使用一个int型变量代表同步状态,通过内置的队列来完成线程的排队工作。 2、下面是JDK8文档中对于AQS的部分介绍 public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer imple...
2019-04-13 22:18:00
133
原创 leetcode-数组中只出现一次的数字
leetcode-数组中只出现一次的数字 一、版本1—有序数组中只出现一次的数字1、题目描述 给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。 示例 1:输入: [1,1,2,3,3,4,4,8,8]输出: 2 示例 2:输入: [3,3,7,7,10,11,11...
2019-03-20 22:53:00
358
原创 leetcode-比特位计数
leetcode-比特位计数 一、题目描述给定一个非负整数num。对于0 ≤ i ≤ num范围中的每个数字i,计算其二进制数中的 1 的数目并将它们作为数组返回。示例 1:输入: 2输出: [0,1,1]示例2:输入: 5输出: [0,1,1,2,1,2]要求: ①给出时间复杂度为...
2019-03-20 20:38:00
298
原创 leetcode-数组-子集
leetcode-数组-子集 一、题目描述给定一组不含重复元素的整数数组nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1...
2019-03-20 13:24:00
325
原创 leetcode-查找和替换模式
leetcode-查找和替换模式 一、题目描述你有一个单词列表words和一个模式pattern,你想知道words中的哪些单词与模式匹配。如果存在字母的排列p,使得将模式中的每个字母x替换为p(x)之后,我们就得到了所需的单词,那么单词与模式是匹配的。(回想一下,字母的排列是从字母到字母的双射:每个字母映射到另一个字母...
2019-03-19 23:17:00
211
原创 基本排序算法实现
一、简单选择排序 1、简单选择排序的思想是这样的:首先,找到数组中最小的元素,其次,将它和数组中的第一个元素交换位置。再次,在剩下的元素中寻找最小的元素,然后将它和数组中第二个元素交换位置,这样往复进行,知道到数组中最后一个元素的时候就变成了有序数组。 2、简单选择排序算法:对于长度为N的数组,需要N2/2次比较和N次交换。 3、下面是一次选择排序的流程:从下面的流程...
2019-03-15 16:09:00
142
原创 Java内存模型
Java内存模型 Java内存模型 为了屏蔽各种硬件和操作系统的内存访问差异,实现Java在不同平台下都能达到一致的内存访问效果,而定义出的一种内存模型规范。一、主内存和工作内存 Java内存模型的主要目标是为了定义程序中各个变量的访问规则(虚拟机中读写变量....这些变量包括实例字段、静态字段、构成数组对象的元素,但不包括线程私有...
2019-03-12 16:19:00
84
原创 JVM之垃圾收集器与内存分配回收策略(二)
JVM之垃圾收集器与内存分配回收策略(二) 上一篇JVM垃圾收集器与内存分配策略(一),下面是jdk1.7版本的垃圾收集器之间的关系,其中连线两端的两种垃圾收集器可以进行搭配使用,下面来总结一下这些收集器的一些特点以及关系。一、Serial收集器 1、serial收集器是一个单线程的收集器,单线程说明两点:①只会使用一个CPU或者一条...
2019-03-12 09:48:00
127
原创 Java并发编程基础——同步
Java并发编程基础——同步 一、synchronized 关键字 1)synchronized 锁什么?锁对象。可能锁对象包括: this, 临界资源对象,Class 类对象。如同下面例子所示; 1 package cn.test.juc; 2 3 public class TestSynchronized { 4 ...
2019-02-28 01:58:00
576
原创 二维数组的查找问题
二维数组的查找问题 package cn.test;/*在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 */public class Test01 { pri...
2019-02-27 20:40:00
206
原创 Maven整合SSM测试
Maven整合SSM测试 前面也说到了关于SSM的整合,话不多说直接从创建项目开始CRUD之路(参考前面写过的Mybatis和Spring整合,SSM简单整合),这是整个项目的结构 以及最终的结果。(附上下载地址)一、创建Maven项目1、在Project中按照下面步骤进行创建一个新的maven项目2、然后填写项目的...
2019-02-27 20:13:00
270
原创 Mysql基础
Mysql基础 本文中使用的测试数据表:sql-learn.sql一、创建和操作数据表 1、创建表 a)创建表使用create table:包括表的名字,标的字段(使用逗号隔开)CREATE TABLE `t_user` ( `user_id` INT(11) NOT NULL AUTO_INCREMENT, ...
2019-02-27 12:37:00
1191
原创 SpringMVC之Controller和参数绑定
SpringMVC之Controller和参数绑定 在上一篇Spring+SpringMVC+Mybatis整合中说到了SSM的整合,并且在其中添加了一个简单的查询功能,目的只是将整个整合的流程进行一个梳理,下面在上一篇中工程的基础上再说一些关于SpringMVC的Controller的一些细节。 首先附上整个项目结构图,附上整个...
2019-02-23 14:38:00
235
原创 Spring+SpringMVC+Mybatis整合
Spring+SpringMVC+Mybatis整合 一、简单测试工程搭建1、Mybatis所需要的的jar包(包含数据库驱动包和相关的日志包)、SpringMVC和Spring的jar包2、然后构建一个基本的工程,这里我们使用mapper代理的方式进行Mybatis的编写,关于mapper代理请参考Mybatis简单入门中的Mybatis开...
2019-02-20 14:28:00
265
原创 JVM之虚拟机类加载机制
JVM之虚拟机类加载机制 有兴趣可以先参考前面的几篇JVM总结: JVM自动内存管理机制-Java内存区域(上) JVM自动内存管理机制-Java内存区域(下) JVM垃圾收集器与内存分配策略(一) 我们知道,在编写一个Java程序后,需要由虚拟机将描述类的数据从Class文件(这里面的Class文件不是指某个特定存在于磁盘上...
2019-02-19 16:06:00
148
原创 JVM垃圾收集器与内存分配策略(一)
JVM垃圾收集器与内存分配策略(一) 在前面的Java自动内存管理机制(上)和Java自动内存管理机制(下)中介绍了关于JVM的一些基础知识,包括运行时数据区域划分和一些简单的参数配置,而其中也谈到了GC,但是没有深入了解,所以这里开始简单的了解一下GC知识。本篇中主要介绍垃圾收集器回收对象的时候怎样判断对象是否已死和一些垃圾收集算法的概念。...
2019-02-17 20:36:00
151
原创 JVM自动内存管理机制——Java内存区域(下)
JVM自动内存管理机制——Java内存区域(下) 一、虚拟机参数配置 在上一篇《Java自动内存管理机制——Java内存区域(上)》中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置。 1、Java堆参数设置 a)下面是一些简单的使用参数 其中最后一个是一个运行时参数设置的简单实例。一般-XX是系统级别的配置...
2019-02-11 18:20:00
174
原创 JVM自动内存管理机制——Java内存区域(上)
JVM自动内存管理机制——Java内存区域(上) 一、JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄漏和内存溢出的问题。显然,这里的不容易只是相对而言的,如果我们想要降低这种代码隐患的发生,就需要...
2019-02-08 23:32:00
137
原创 单源最短路径算法——Bellman-ford算法和Dijkstra算法
BellMan-ford算法描述1.初始化:将除源点外的所有顶点的最短距离估计值 dist[v] ← +∞, dist[s] ←0;2.迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离;(运行|v|-1次)3.检验负权回路:判断边集E中的每一条边的两个端点是否收敛。如果存在未收敛的顶点,则算法返回false,表明问题无解...
2019-02-05 17:03:00
1147
原创 Mybatis延迟加载、缓存
一、Mybatis中的延迟加载 1、延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用association、collection实现一对一及一对多(多对多)映射),同样的association、collection具备延迟加载功能。所谓延迟加载,就是先单表查询,需要时再从关联表去关联查询(同样也可能只是是单表查询),大大单表查询速度更...
2019-02-05 01:23:00
95
原创 Mybatis关系映射
一、一对一关系映射使用resultType+包装类实现 1、假设问题背景是要求在某一个购物平台的后台程序中添加一个这样的功能:查询某个订单的信息和下该订单的用户信息。首先我们可以知道,一般这样的平台上面,某一笔订单只属于某一个用户,从这个角度来看,可以作为一对一的参考模型 ①首先创建数据表user(用户表)CREATE TABLE `user` ( `uid...
2019-02-04 15:48:00
144
原创 Mybatis简单入门
Mybatis简单入门 1、Mybatis概述 MyBatis 是支持普通 SQL 查询(相比较于Hibernate的封装,Mybatis是半自动化的JDBC封装,一个特点就是Mybatis执行的SQL查询语句需要自己在配置文件中写),存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以...
2019-02-04 06:51:00
496
原创 SpringMVC入门
SpringMVC入门 一、SpringMVC原理解析 1、我们首先分析一下整个请求处理的流程: ①在B/S架构的系统中,用户首先从浏览器中发出Http请求(请求中会包含用户的请求内容信息或者表单信息),然后首先经过前端控制器(DispatcherServlet)进行处理, ②然后前端控制器需要接触处理器映射器知道自己使用哪一个处理器处...
2019-02-03 19:07:00
123
原创 Mybatis和Spring整合
Mybatis和Spring整合 一、dao接口+实现类的方式 1、先创建好整合工程结构 2、对于Spring和Mybatis 整合,我们先从数据库开始,即先创建一张简单的数据表,Sql如下CREATE TABLE `t_user` ( `id` INT(10) NOT NULL AUTO_INCREMENT, `user...
2019-02-01 23:09:00
169
PhoneBookWork.zip
2019-12-09
Mybatis入门
2019-01-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人