摘要: 1 synchronized底层原理 我们先通过反编译下面的代码来说明问题。 public class SynchronizedDemo { public void method() { synchronized (this) { System.out.println("Method 1 start 阅读全文
posted @ 2018-03-11 16:44 balfish 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 一 mysql的悲观锁 - 以行锁做示例 每次拿数据的时候都认为别的线程会修改数据,所以每次拿数据的时候都会给数据上锁。上锁之后,当别的线程想要拿数据时,就会阻塞。直到给数据上锁的线程将事务提交或者回滚。传统的关系数据库里面很多用了这种锁机制,比如行锁,表锁,共享锁,排他锁等,都是在做操作之前先上锁 阅读全文
posted @ 2018-03-03 09:27 balfish 阅读(6242) 评论(0) 推荐(0) 编辑
摘要: 一 数据库事务的隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable ,后三个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题。 1. Read UnCommitted( 阅读全文
posted @ 2018-01-16 19:06 balfish 阅读(43058) 评论(5) 推荐(10) 编辑
摘要: 一 MyISAM索引实现 1. 主键索引 MyISAM引擎使用B+树作为索引结果,叶节点的data域存放的是数据记录的地址。下图为MyISAM表的主索引,Col1为主键。 2. 辅助索引 在MyISAM中,主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复 阅读全文
posted @ 2018-01-15 17:08 balfish 阅读(18739) 评论(1) 推荐(7) 编辑
摘要: 一 B树的由来 B树指的是一类树,包括B-树,B+树,B*树等,是一种自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B树允许每个节点有更多的子节点。B树是专门为外部存储器设计的,如磁盘,它对于读取和写入大块数据有良好的性能,所以一般用在文件系统及数据库中 1. 为什么不用二叉平衡树 传统用来搜 阅读全文
posted @ 2018-01-15 16:23 balfish 阅读(924) 评论(0) 推荐(0) 编辑
摘要: 一 二叉查找树 特点:非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树 查找元素过程: 从根结点开始,如果查询的关键字与结点的关键字相等则命中;否则如果查询关键字比结点关键字小就进入左儿子;比结点关键字大就进入右儿子;如果左儿子或右儿子的指针为空则找不到相应的关键字; 性能:最 阅读全文
posted @ 2018-01-12 17:23 balfish 阅读(411) 评论(0) 推荐(0) 编辑
摘要: 下图是一个基本的index.html页面和它的样式文件a.css 放到服务器,访问页面网络请求200大功告成。 但是我们思考一个问题,如果每次用户访问页面都需要加载这个a.css的请求,很影响性能和浪费带宽,我们希望下面这个样子 利用304让浏览器使用本地缓存,考虑这样是否有问题?有!304叫协商缓 阅读全文
posted @ 2018-01-12 15:20 balfish 阅读(1044) 评论(0) 推荐(0) 编辑
摘要: 这里我们需要理解的一点是Reactor线程模型是基于同步非阻塞IO实现的。对于异步非阻塞IO的实现是Proactor模型。 一 Reactor单线程模型 Reactor单线程模型就是指所有的IO操作都在同一个NIO线程上面完成的,也就是IO处理线程是单线程的。NIO线程的职责是: (1)作为NIO服 阅读全文
posted @ 2018-01-05 17:09 balfish 阅读(2099) 评论(0) 推荐(0) 编辑
摘要: 一 缓存与数据库不一致的三种情况 1. 数据库有数据,缓存没有数据; 2. 数据库有数据,缓存也有数据,数据不相等; 3. 数据库没有数据,缓存有数据。 二 一致性策略 1. 首先尝试从缓存读取,读到数据则直接返回;如果读不到,就读数据库,并将数据会写到缓存,并返回。 2. 需要更新数据时,先更新数 阅读全文
posted @ 2018-01-03 16:03 balfish 阅读(219) 评论(0) 推荐(0) 编辑
摘要: 浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。 深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。 一 demo演示 1 Professor类 1 阅读全文
posted @ 2018-01-03 11:33 balfish 阅读(452) 评论(1) 推荐(0) 编辑
摘要: 一 双指针 1.1 最大盛水量(No.11) 两个指针l和r,初始化为数组的两端,然后向中间移动找到最大的面积。如果l指向的数字小,则l需要右移才有可能获得更大容量,因为r左移,得到的容量肯定比r左移之前的容量小(高度已经被较小的l限制住了)。同理,r指向的数据小的话,则需要进行左移r。 publi 阅读全文
posted @ 2017-12-28 18:39 balfish 阅读(1795) 评论(0) 推荐(0) 编辑
摘要: 一 概述 redis是一种key-value数据库,支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 1 String(字符串) string是键值对形式。一个键最大能存储512MB。string类型是二进制安 阅读全文
posted @ 2017-12-27 12:06 balfish 阅读(608) 评论(1) 推荐(0) 编辑
摘要: 一 NULL 为什么这么经常用 (1) java的null null是一个让人头疼的问题,比如java中的NullPointerException。为了避免猝不及防的空指针,需要小心翼翼地各种if判断,麻烦又臃肿. 为此有很多的开源包都有诸多处理 common lang3的StringUtils.i 阅读全文
posted @ 2017-11-27 17:16 balfish 阅读(19098) 评论(2) 推荐(1) 编辑
摘要: 所有算法都要达到纸上手写运行无误。 1 排序(冒泡 & 选择 & 快排) 我们通常所说的排序算法往往指的是内部排序算法,即数据记录在内存中进行排序。 一种是比较排序,时间复杂度O(nlogn) ~ O(n^2),主要有冒泡排序,选择排序,归并排序,堆排序,快速排序等 另一种是非比较排序,时间复杂度可 阅读全文
posted @ 2017-11-20 16:10 balfish 阅读(538) 评论(0) 推荐(0) 编辑
摘要: 一 概述 Copy-On-Write即写时复制的容器,是一种用于程序设计中的优化策略。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对Co 阅读全文
posted @ 2017-11-10 14:56 balfish 阅读(398) 评论(0) 推荐(0) 编辑