自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 一致性非锁定读和一致性锁定读

一致性的非锁定读在默认配置下innodb的隔离级别是repeatable read,innodb的select操作使用的是一致性非锁定读一致性的非锁定行读(consistent nonlocking read,简称CNR)是指InnoDB存储引擎通过行多版本控制(multi versioning)的方式来读取当前执行时间数据库中运行的数据。如果读取的行正在执行delete、update操作...

2019-03-02 18:49:03 2006

原创 设计模式的六大原则

一、"开放-封闭"原则(OCP)Open-Closed Principle原则讲的是:一个软件实体应当对扩展开放,对修改关闭二、 里氏代换原则(LSP)Liskov Substitution Principle(里氏代换原则):子类型(subtype)必须能够替换它们的基类型。三、 依赖倒置原则(DIP) 依赖倒置(Dependence Inversion Principle)...

2018-08-21 10:55:37 261

原创 java线程的5种状态及其转换

Java中的线程的生命周期大体可分为5种状态。1. 新建(NEW):新创建了一个线程对象。2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。3. 运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ...

2018-08-16 19:43:06 320

原创 创建线程的三种方式

一、继承Thread类创建线程类(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。(2)创建Thread子类的实例,即创建了线程对象。(3)调用线程对象的start()方法来启动该线程。二、通过Runnable接口创建线程类(1)定义runnable接口的实现类,并重写该接口的run()方法,该...

2018-08-16 19:40:55 313

原创 ABA问题的解决方法

CAS操作可能带来ABA问题,因为CAS操作需要在操作值的时候,检查值有没有发生变化,如果没有发发生变化则更新。如果一个值原理是A,变成了B,又变成了A,那么使用CAS进行检查时会认为它的值没有变化,但是实际上却变了。ABA问题的解决办法就是使用版本号,在变量前面追加版本号,每次变量更新时把版本号加1,那么A-B-A就会变成1A-2B-3A。从jdk1.5开始,jdk中的Atomic包里提...

2018-08-16 19:39:47 9634

原创 ThreadLocal

对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量(实际上,这项工作需要程序员自己实现),因此可以同时访问而互不影响。比如,要让100个人填一张表,如果只有一支笔。对于管理人员必须保证大家不会哄抢这一支笔,否则,大家都填不完。从另一个角度,我们可以准备...

2018-08-16 19:38:18 2083

原创 线程池

什么是线程池合理使用线程池的好处:线程池的实现原理参考博客:https://blog.csdn.net/mine_song/article/details/70948223ThreadPoolExecutor大的实箭头表示继承(箭头尾是子类),大的虚箭头表示实现,小的实箭头表示表示关联即Executors中有ThreadPoolExecutor的实例引用。Thr...

2018-08-16 19:33:53 158

原创 ReentrantLock 重入锁(互斥锁)

参考博客:https://blog.csdn.net/jiangjiajian2008/article/details/52226189Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的与synchronized相比,重入锁有着显式的操作过程,开发人员必须手动的指定何时加锁(调用lock方法),何时释放锁(调用unlock方法)。因此,重入锁对逻辑的控...

2018-08-16 19:22:57 3333

原创 AQS,同步器框架(AbstractQueuedSynchronizer,队列同步器)

参考博客:https://blog.csdn.net/vernonzheng/article/details/8275624https://www.cnblogs.com/200911/p/6031350.html而juc(java.util.concurrent)里的思想是 将这些场景抽象出来的语义通过统一的同步框架来支持。juc里所有的这些锁机制都是基于AQS(AbstractQueu...

2018-08-16 19:18:42 679

原创 happens-before(先行发生原则)

JSR-133使用happens-before的概念来阐述操作之间内存的可见性,在JMM中如果一个操作的结果需要对另一个可见,那么这两个操作之间必须要存在happens-before规则注意:两个操作之间有happens-before关系,并不意味着前一个操作必须要在后一个操作之前执行。happens-before仅仅要求前一个操作的(执行的结果)对后一个操作可见。JMM的设计思想:程序员...

2018-08-16 19:15:04 1014

原创 Synchronized的实现原理

版本1:每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程如下:1、如果monitor的锁计数器为0,则该线程进入monitor,然后将计数器设置为1 ,该线程即为monitor的所有者。2、如果线程已经占有该monitor,只是重新进入,则进入monitor的计数器加13....

2018-08-16 19:14:08 250

原创 volatile的实现原理

关键字volatile是JVM提供的最轻量级的同步机制为什么要使用VolatileVolatile变量修饰符如果使用恰当的话,它比synchronized的使用和执行成本会更低,因为它不会引起线程上下文的切换和调度。Java内存模型对volatile专门定义了一些特殊的访问规则,当一个变量被定义成volatile之后,他将具备两种特性:1、保证此变量对所有线程的可见性。2、禁止...

2018-08-16 19:12:09 718

原创 锁的类型

锁对象用于管理对共享资源的并发访问Innodb存储引擎实现了如下2种标准的行级锁:共享锁(S lock),允许事务读取一行数据。排它锁(X lock),允许事务删除或者更新一行数据。当一个事务获取了行r的共享锁,那么另外一个事务也可以立即获取行r的共享锁,因为读取并未改变行r的数据,这种情况就是锁兼容。但是如果有事务想获得行r的排它锁,则它必须等待事务释放行r上的共享锁—这种情况就是锁...

2018-08-07 16:41:36 960

原创 悲观锁和乐观锁

数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性。我们都知道锁的种类一般分为乐观锁和悲观锁两种,InnoDB 存储引擎中使用的就是悲观锁,而按照锁的粒度划分,也可以分成行锁和表锁。Innodb支持行锁,MyIsam只支持表锁乐观锁乐观锁和悲观锁其实都是并发控制的机制,同时它们在原理上就有着本质的差别;乐观锁是一种思想,它其实并不是一种真正的『锁』,它会先尝...

2018-08-07 15:40:03 170

原创 前缀索引和覆盖索引

前缀索引当索引的字符串列很大时,创建的索引也就变得很大,为了减小索引体积,提高索引的扫描速度,就用索引的前部分字串索引,这样索引占用的空间就会大大减少,并且索引的选择性也不会降低很多。而且是对BLOB和TEXT列进行索引,或者非常长的VARCHAR列,就必须使用前缀索引,因为MySQL不允许索引它们的全部长度。使用:列的前缀的长度选择很重要,又要节约索引空间,又要保证前缀索引的选择性要和...

2018-08-07 15:38:08 1379

原创 联合索引(多列索引)

联合索引是指对表上的多个列进行索引,联合索引也是一棵B+树,不同的是联合索引的键值数量不是1,而是大于等于2.最左匹配原则假定上图联合索引的为(a,b)。联合索引也是一棵B+树,不同的是B+树在对索引a排序的基础上,对索引b排序。所以数据按照(1,1),(1,2)......顺序排放。对于selete * from table where a=XX and b=XX,显然是可以使用...

2018-08-07 15:37:09 34552 5

原创 聚簇索引和非聚簇索引

参考博客:http://www.admin10000.com/document/5372.html聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体细节依赖于其实现方式。MySQL数据库中innodb存储引擎,B+树索引可以分为聚簇索引(也称聚集索引,clustered index)和辅助索引(有时也称非聚簇索引或二级索引,secondary index,non-clustere...

2018-08-07 15:34:30 15676 7

原创 B+树索引

参考博客:http://www.admin10000.com/document/5372.htmlB+树索引的构造类似于二叉树,根据键值快速找到数据,B+树中的B代表平衡(balance),B+树索引并不能找到一个给定键值的具体行,B+树索引只能找到被查找数据行所在的页,数据库把页读入到内存中,最后在内存中查找到相应的数据。B树和B+树详见:https://blog.csdn.net/...

2018-08-07 15:28:03 4502

原创 MySQL索引的类型

在《高性能MySQL》中按照数据结构的不同将索引分为B+树索引、哈希索引、全文索引。B+树索引就是传统意义上的索引使用索引的优点:第一,索引大大减少了服务器需要扫描的数据量,可以帮助服务器避免排序和临时表,索引可以将随机I/O变为顺序I/O第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。第四...

2018-08-07 15:17:21 120

原创 MySQL事务的四大特性

事务(transaction):是一组原子性的SQL查询,或者说是一个独立的工作单元。事务内的语句,要么就全部执行,要么就全都不执行。⑴ 原子性(Atomicity)  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。⑵ 一致性(Consistency)  一致性是指事务必须使数据库从...

2018-08-07 15:14:53 2071

转载 数据库的三大范式和五大约束

第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;第三范式(3NF):必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键)【如何更好的区分三大范式】...

2018-08-07 15:11:48 985

原创 MyISAM和InnoDB存储引擎的特点

Mysql区别于其他数据库的一个重要特点是其插件式的表存储引擎,注意,存储引擎是基于表的,而不是基于数据库。MyISAM特性 不支持事务:MyISAM存储引擎不支持事务,所以对事务有要求的业务场景不能使用表级锁定:其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,...

2018-08-07 15:10:16 2324

原创 虚拟机类加载机制

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为连接(Linking)。如图所示。加载、验证、准备、初始化和卸载这5个阶段的顺序...

2018-06-21 21:45:16 126

原创 JVM垃圾收集器与内存分配策略

判断对象是否存活在进行GC之前,首先要确定的就是在java堆中那些对象已经“死去”那些对象还“活着”引用记数法(Referencecounting)了解即可,虚拟机并不是通过该算法来判断对象是否存活。引用计数器的实现很简单,对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1,当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,则对象A就不可能再被使用。存在的问题:很难处...

2018-06-21 21:42:12 138

原创 JVM内存区域划分及其作用

一、运行时数据区1、程序计数器(寄存器)当前线程所执行的字节码行号指示器字节码解释器工作依赖计数器控制完成通过执行线程行号记录,让线程轮流切换各条线程之间计数器互不影响线程私有,生命周期与线程相同,随JVM启动而生,JVM关闭而死线程执行Java方法时,记录其正在执行的虚拟机字节码指令地址线程执行Nativan方法时,计数器记录为空(Undefined)唯一在Java虚拟机规范中没有规定任何Out...

2018-06-21 21:34:26 2256

空空如也

空空如也

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

TA关注的人

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