自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Spring IOC源码分析(一)

ps:整个系列之前使用有道云整理的,所以代码都是截图格式1.相关类介绍1.1 Resource类Resource类是Spring对资源的抽象。它的每一个实现类都代表了一种资源的访问策略,如 ClassPathResource、RLResource、FileSystemResource 等。1.2 ResourceLoader类有了资源,就应该有资源加载,Spring ...

2019-05-16 11:22:52 195

原创 JVM运行时数据区域

以下所有内容摘自《深入理解Java虚拟机》第二版               Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范(JavaSE 7版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行...

2018-10-24 12:50:36 173

原创 队列同步器

1.队列同步器简介    队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作,并发包的作者(Doug Lea)期望它能够成为实现大部分同步需求的基础。    同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同...

2018-08-06 17:42:22 192

转载 数据库事务隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。1.Read uncommitted 读未提交公司发工资了,领导把5000元打到singo的账号上,但是该事务并未提交,而singo正好去查看账户,发现工资已经到账,是...

2018-08-04 17:08:56 147

转载 B树和B+树简介

一.B树一种平衡的多叉树,称为B树(或B-树、B_树)。一棵m阶B树是一棵平衡的m路搜索树。它或者是空树,或者是满足下列性质的树:1、根结点至少有两个子女;2、每个非根节点所包含的关键字个数 j 满足:m/2 - 1 <= j <= m - 1;3、除根结点以外的所有结点(不包括叶子结点)的度数正好是关键字总数加1,故内部子树个数 k 满足:m/2 <= k ...

2018-08-04 13:12:06 1251

原创 贪婪算法的小例子记录

一 定义       贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。       贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关二 例子(1)求字符串中最大长度的回文串这...

2018-08-04 13:11:54 1227

原创 Java双重检查锁的错误

1.错误的双重检查锁实现public class DoubleCheckedLocking { // 1 private static Instance instance; // 2 public static Instance getInstance() { // 3 if (instance == null) { // 4:第一次检查 synchr...

2018-07-26 20:33:55 508 1

原创 Final域的重排序规则

*摘自《Java并发编程的艺术》——方腾飞1.final类型为基本类型时对于final域,编译器和处理器要遵守两个重排序规则。1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。2)初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。总结来说,对final域的写入操作(初始化...

2018-07-26 18:36:42 1664

原创 volatile的特性

*摘自《Java并发编程的艺术》——方腾飞1.volatile的特性        理解volatile特性的一个好方法是把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。下面通过具体的示例来说明,示例代码如下。class VolatileFeaturesExample { volatile long vl = 0L; // 使用volat...

2018-07-25 20:07:51 1624

原创 Java5及以上版本中对内存读写的原子性

从JSR-133内存模型开始(即从JDK5开始),仅仅只允许把一个64位long/double型变量的写操作拆分为两个32位的写操作来执行,任意的读操作在JSR-133中都必须具有原子性(即任意读操作必须要在单个读事务中执行)...

2018-07-25 18:13:07 216

原创 happens-before,内存重排序,数据依赖的理解

在JMM(Java内存模型)中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。happens-before原则规则:程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作; 锁定规则:一个unLock操作先行发生于后面对同一个锁的lock操作; volatile变量规则:对一个变量的写操作先行发生于后...

2018-07-24 12:43:13 849 1

原创 Redis集群批量操作

      众所周知,Redis集群是没法执行批量操作命令的,如mget,pipeline等。这是因为redis将集群划分为16383个哈希槽,不同的key会划分到不同的槽中。但是,Jedis客户端提供了计算key的slot方法,已经slot和节点之间的映射关系,通过这两个数据,就可以计算出每个key所在的节点,然后使用pipeline获取数据。具体代码如下:/** * 根据key计算sl...

2018-07-23 17:32:22 4914 1

原创 Redis相关问题和解决方法记录

1.缓存穿透        缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中。所以每次查询这条数据的时候,都先查一遍缓存,然后再查一遍数据库。解决的办法是,在缓存中保存一个空值,来标记该数据在数据库中不存在,同时给该值设置一个较短的过期时间,防止被恶意攻击时产生太多的key。2.缓存无底洞        键值数据库由于通常采用哈希函数将key映射到各个节点上,造成key的...

2018-07-23 16:53:40 428

原创 Java泛型理解

Java集合工具类Collections里定义了sort方法,里面的泛型很有意思:<T extends Comparable<? super T>>对于这个泛型,我们来理解一下:首先,泛型T是要继承Comparable接口的,这个没什么疑问。重点是Comparable接口里定义的泛型,必须是泛型T或者泛型T的父类。什么意思呢?如果我有两个类,A和B,A是B的父类...

2018-07-19 13:18:09 684

原创 Java泛型集合理解

1.只读集合使用<? extends T>定义的集合,只能读取,不能插入。原因是什么呢?我们从头开始分析:首先,我们知道,<? extends T>修饰的集合,表示该集合内部的元素类型只能是T或者是T的子类,比如,有A,B,C三个类,B类和C类继承了A类,<? extends A>的集合,可以插入A,B,C三个子类的实例。那么,当我们插入这个三个实例之后...

2018-07-19 12:50:47 2329

原创 java四种引用

1.强引用强引用指向的对象,在任何时候都不会被回收。除非将引用置为null/** * 强引用 */public class StrongReferences { public static void main(String[] args) { //创建一个对象,new出来的对象都是分配在java堆中的 Sample sample = new Samp...

2018-07-18 12:00:13 153

原创 volatile关键字修饰对象时注意事项

下面的代码实现无锁循环打印A,B,C的功能,但是volatile关键字用错的话,会导致数据不打印1.当volatile修饰公共的成员变量时public class ThreadTest { private static volatile C c = new C(); public static void main(String[] args) { new Thread(n...

2018-07-10 18:30:40 7179

原创 线程池参数理解

之前学习的并发知识,现在记录一下主要参数说明线程池(ThreadPoolExecutor),Jdk1.5版本开始使用,构造方法参数如下(来自ThreadPoolExecutor源码):corePoolSize:核心线程数,线程池启动时就会创建的线程数量。即使核心线程是空闲的,也不会被回收,除非调用了allowsCoreThreadTimeOut方法为trueexecutorS...

2018-07-02 18:15:03 4493

空空如也

空空如也

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

TA关注的人

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