自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 悲观锁与乐观锁(面试必备)

悲观锁与乐观锁.

2020-03-30 12:23:32 117

转载 红黑树(漫画讲解)

红黑树.

2020-03-30 10:35:50 113

转载 B+树详解

点击查看原文.

2020-03-25 19:57:01 271

原创 MySQL 常见的两种存储引擎:MyISAM与 InnoDB的理解

关于二者的对比与总结:1. count运算上的区别:因为MyISAM缓存有表meta-data(行数等),因此在做COUNT(*)时对于一个结构很好 的查询是不需要消耗多少资源的。而对于InnoDB来说,则没有这种缓存。2. 是否支持事务和崩溃后的安全恢复:MyISAM 强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型 更快,但是不提供事务支持。但是InnoDB 提供...

2020-03-25 19:16:56 227

转载 ConcurrentHashMap介绍

ConcurrentHashMap使用了锁分段技术来提供更高的并发性和伸缩性。锁分段技术就是说容器里有多把锁,每一把锁用于锁容器其中一部分数据,当多线程访容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效提高并发效率。在CurrentHashMap中,首先将数据分成一段一段的存储,然后给每段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。可重入...

2020-03-24 19:51:43 357

转载 简述Java内存模型的happen before原则

先行发生原则(Happens-Before)是判断数据是否存在竞争、线程是否安全的主要依据。先行发生是Java内存,模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,那么操作A产生的影响能够被操作B观察到。口诀:如果两个操作之间具有happen-before关系,**那么前一个操作的结果就会对后面的一个操作可见。**是Java内存模型中定义的两个操作之间的偏序关系。常见的hap...

2020-03-24 18:34:34 520

原创 为什么HashMap线程不安全

1.put操作时导致多线程数据不一致当有多个线程进行put操作时假设现在有两个线程A跟B进行put操作,线程A已经计算完要放入记录的桶的索引坐标,但是还没有将记录插到桶里面时A的时间片就已经用完,然后轮到线程B执行,假设B的索引坐标跟A的一样,不同点是线程B成功插入记录,那么线程A再次被调度运行时,所用的索引坐标跟线程B的索引坐标一样,线程A将记录插入之后,就会把线程B插入的记录覆盖掉,因此...

2020-03-24 17:37:34 111

原创 volatile关键字的两层语义

1.保证了不同线程对被volatile修饰的变量进行操作时的可见性,对volatile变量的所有写操作能立刻反应到其他线程中,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。  2.禁止指令重排序优化。...

2020-03-23 19:37:59 110

转载 volatile能保证有序性吗?

volatile能保证有序性多线程通过抢占时间片来执行自己的代码体,所以我们会感觉到线程是同时执行完的,除了引入了时间片以外,由于处理器优化和指令重排等,CPU还可能对输入代码进行乱序执行,比如我们拿到数据要执行写库,查询,删除这三个操作,这就会可能要涉及到有序性的问题了。volatile可以禁止指令指令重排序,这就保证了代码的程序会严格按照代码的先后顺序执行。这就保证了有序性。被volat...

2020-03-23 19:21:34 899

转载 volatile的原理和实现机制 || volatile到底如何保证可见性和禁止指令重排序的?

下面这段话摘自《深入理解Java虚拟机》:“观察加入volatile关键字和没有加入volatile关键字时所生成的汇编代码发现,加入volatile关键字时,会多出一个lock前缀指令”lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句...

2020-03-23 18:56:43 275

转载 volatile能保证原子性吗?

volatile不能保证原子性。当跟自增操作一起时,自增操作本身不是原子性操作。class Data { public volatile int number; public void add(){ number++; }}public class Main { public static void main(String[] args) {...

2020-03-23 18:46:48 3486 5

转载 线程启动的方法start()和run()

1.start使用start方法才真正实现了多线程运行,因为使用start()方法不用等待run方法体代码执行完毕而直接继续执行下面的代码。因为thread线程有5种状态,创建-就绪-运行-阻塞-死亡这五种,用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,等到cpu空闲时,才会执行线程里面的run方法,run方法运行完毕,此线程结束。2.ru...

2020-03-23 18:17:42 3949

转载 哪些是线程安全的容器

同步容器类:使用了synchronized1.Vector2.HashTable并发容器:3.ConcurrentHashMap:分段4.CopyOnWriteArrayList:写时复制5.CopyOnWriteArraySet:写时复制Queue:6.ConcurrentLinkedQueue:是使用非阻塞的方式实现的基于链接节点的无界的线程安全队列,性能非常好。(jav...

2020-03-23 16:57:46 1204

原创 对象的内存布局

对象的内存布局包括三个部分:对象头,实例数据和对齐填充。对象头:对象头包括两部分信息,第一部分是存储对象自身的运行时数据,如哈希码,GC分代年龄,锁状态标志,线程持有的锁等等。第二部分是类型指针,即对象指向类元数据的指针。实例数据:指的就是数据(成员变量的值,包括父类成员变量和本类成员变量。)对齐填充:不是必然的存在,也没有特别的含义,就是为了对齐。...

2020-03-23 16:45:37 90

原创 线程安全

线程安全就是多线程访问时,采用了加锁机制。当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据...

2020-03-23 16:38:11 99

原创 同步、异步、阻塞、非阻塞

同步:就是在发出一个调用时,在没有得到结果之前, 该调用就不返回。调用者需要一直等待结果。异步:调用在发出之后,这个调用就直接返回了,但没有返回结果,等处理完该调用后,通知调用者结果。阻塞调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞在不能立刻得到结果之前,该调用不会阻塞当前线程。举例:人物:老张道具:普通水壶(水烧开不响);响水壶(水烧开发出...

2020-03-23 15:34:20 127

原创 volatile和synchronized的区别

1.volatile本质是在告诉JVM当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取。synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别。3.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的...

2020-03-22 22:49:07 197

转载 java同步线程有哪些方式?

参考:https://blog.csdn.net/Michaeles/article/details/86500835.

2020-03-22 22:08:40 171

转载 双亲委派机制

1、当AppClassLoader(应用程序类加载器)加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader(扩展类加载器)去完成。2、当ExtClassLoader(扩展类加载器)加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader(启动类加载器)去完成。3、如果Bo...

2020-03-22 18:57:14 86

转载 堆外内存和堆内内存

转载:https://blog.csdn.net/qq_36470686/article/details/84591536.

2020-03-22 18:39:57 197

原创 Minor GC安全检查

JVM堆内存分为:年轻代和老年代Minor GC:发生在年轻代,频率较高速度较快多数Java对象优先在Eden区分配空间,如果Eden空间不足,就会执行Minor GC。并把所有存活下来的对象转移到其中一个survivor区。Minor GC同样会检查存活下来的对象,并把它们转移到另一个survivor区。总共有两个survivor区,要保证总会有一个survivor区是空的,便于下次...

2020-03-22 17:54:19 200

转载 类加载机制过程

1.加载。将代码转换成二进制字节流加载进内存。加载完之后创建一个Class对象,这个对象是访问数据的入口。2.验证。JVM规范验证和代码逻辑验证。3.准备内存分配和初始化。对static修饰的类变量进行内存分配和初始化为0,其他类成员变量到初始化阶段才初始化。4.解析针对接口、字段、方法等进行解析,将常量池中的符号引用替换成内存的直接引用。5.初始化遇到5种情况会进行初始化:ne...

2020-03-22 14:42:38 86

原创 为什么存在GC?

因为年轻代每次只使用一个survivor保存仍存活的对象有了GC,就不需要程序员去人工释放内存空间,可以有效的防止内存泄露,有效的使用可以使用的内存。...

2020-03-22 14:18:55 131

原创 java垃圾回收器

垃圾收集器可以分为回收新生代和回收老年代两种类型收集器。回收新生代收集器有:Serial、PraNew、Parallel Scavenge,回收老年代的收集器有:Serial Old、Parallel Old、CMS,回收整个Java堆:G1收集器。Serial收集器(复制算法):新生代单线程收集器,在进行垃圾回收时需要停止其他的所有工作线程。Serial Old收集器(标记-...

2020-03-22 14:04:27 109

原创 JVM内存布局

JVM五大内存布局:堆、方法区(元空间)、虚拟机栈、本地方法栈、程序计数器堆和方法区线程共享虚拟机栈、本地方法栈和程序计数器线程私有即每个线程都会有自己的分配空间堆是内存最大的一块,主要存放对象实例和数组;方法区主要存储已被虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等数据。虚拟机栈主要存放局部变量表、操作栈、动态链接、方法出口等信息;本地方法栈和虚拟机栈基本一样,不...

2020-03-21 21:26:06 163 1

转载 从年轻代转移到老年代

1.通过年龄计数器判断一个对象是否需要转移。1.通过年龄计数器判断一个对象是否需要转移。对象每经过一个GC仍然存活,年龄计数器加一。当年龄超过设定的值,则将其通过担保机制转移到老年代。2.或者动态绑定,当Suvivor中年龄相同的对象数量超过一半,则年龄大于等于该年龄的的对象转移到老年代,无需等待设置的最大年龄值。3.大对象直接进入老年代。转载地址:https://my.oschina....

2020-03-21 20:59:41 698

原创 哪些对象存放到老年代?

1.大对象(字符串与数组),是指需要大量连续内存空间的java对象,比如字符串和数组。即超过了设定值的对象,直接在老年代中分配。2.长期存活的对象可以从年轻代进入老年代。...

2020-03-21 20:08:44 1261

原创 JVM垃圾回收算法

1.标记-清除算法:分为“标记”和“清除”两个阶段,先利用可达性分析算法,标记出存活的对象。标记完之后,再扫描整个空间中未被标记的对象进行回收。缺点:效率低,会造成大量碎片。(清除后会产生大量的不连续的内存碎片)2.标记-整理算法:在标记-清除算法的基础上,标记出所有需要回收的对象,但是不会直接清理,而是将存活的对象向一端移动,在移动过程中清理掉可回收对象,并更新对应的指针。优点:解决了...

2020-03-21 19:50:33 128

原创 JVM垃圾回收机制

垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。有两种方法:1.引用计数法:给对象添加一个引用计数器,每当有一个地方引用这个对象时计数器值就+1;引用失效时,计数器值就-1;任何时刻计数器为0的对象代表不可能再被使用。优点:引用计数收集器可以很快地执行,交织在程序运行中。缺...

2020-03-21 19:11:58 102

转载 Java散列表,树对应的容器类,hashmap如何解决冲突

散列表:Hashmap、hashtable、concurrentHashMap、hashset树:treemap、treesetCopyonWriteArrayList是ArrayList 的一个线程安全的变体,其中所有可变操作(add、set等等)都是通过对底层数组进行一次新的复制来实现的。treeset继承自treemap, hashset继承自hashmapEntry:key和v...

2020-03-21 17:53:01 184

原创 双亲委派模型:启动加载器、扩展加载器、应用程序加载器

提到双亲委派模型,首先,要知道什么是类加载器。类加载器就是根据指定全限定名称将class文件加载到JVM内存,转为Class对象。Java中的类加载器主要用于实现类的加载。Java中的类和类加载器一起唯一确定类在JVM中的唯一性。类加载器可以分为二大类,启动类加载器和其他类加载器,其中启动类加载器(Bootstrap ClassLoader):用C++实现,是JVM的一部分,而其他类加载器:...

2020-03-21 17:10:43 235

原创 HashSet 和 HashMap 区别

HashSet 底层就是基于 HashMap 实现的。(HashSet 的源码非常非常少,因为除了 clone() 方法、writeObject()方法、readObject()方法是 HashSet 自己不得不实现之外,其他方法都是 直接调用 HashMap 中的方法。)1.实现接口不同:HashMap实现了Map接口,HashSet实现了set接口。2.存储内容不同:HashMap存储...

2020-03-21 16:48:28 3753

原创 HashMap 的长度为什么是2的幂次方

为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均。Hash 值的 范围值-2147483648到2147483647,前后加起来大概40亿的映射空间,只要哈希函数映射得比较均松散,一般应 用是很难出现碰撞的。但问题是一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之 前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下...

2020-03-21 16:02:10 210

原创 HashMap和HashTable的区别

1.继承不同。Hashtable是基于陈旧的Dictionary类的,HashMap是HashMap是继承自AbstractMap类,Dictionary类现在已经被废弃了。1.线程是否安全:HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过 synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHash...

2020-03-21 15:47:02 118

原创 HashMap的put和get操作

put:执行hash(Object key)得到一个int类型的hash值,然后根据这个hash值就可以找到Node节点的位置了;1.先执行hash(Object key)方法,计算出数据存储在Entry数组当中的位置index。简要说明一下hash(Object key)方法:它内部维护了一个Entry数组,得到key的hashCode值将其移位按位与运算,然后再通过跟数组的长度-1作逻...

2020-03-20 23:16:43 930

转载 HashMap基本原理及内部数据结构

转载:https://my.oschina.net/134596/blog/1800717基本原理:通过hash的方法,通过put和get存储和获取对象。存储对象时,将K/V传给put方法,它会调用hashCode计算hash从而得到bucket的位置,进一步存储。HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr 则resize为原来的2倍)。获取对象时,...

2020-03-20 16:48:29 264

原创 什么时候使用HashMap?它有什么特点

HashMap是基于Map接口的实现,在存储键值对时使用HashMap。特点:1.使用HashMap定义的Map集合,是无序存放的(顺序无用);2.元素(key)不能重复,如果发现了重复的key,会进行覆盖,使用新的内容替换旧的内容;3.使用HashMap子类保存数据时,key或value可以保存为null。4.HashMap是异步的,线程不安全。...

2020-03-20 16:21:01 1708

原创 java实现生产者和消费者的三种方法

在设计实现该模式的时候,需要注意以下三个问题:对容器取产品和添加产品时的同步问题,即任意时刻,取与添加是互斥的,且每一次取操作之间也是互斥的(添加操作也是如此)。方法1:使用wait()和notify(),当容器满了之后,生产者需要暂时停止生产,直到容器非满,当容器空了之后,消费者需要暂时停止消费,直到容器非空,缓冲区为满和为空时都调用wait()方法等待,直到生产者生产了一个产品或者消费者...

2020-03-20 15:59:48 276

转载 java的类加载机制 为什么会出现锁机制?

类从加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。 其中类加载的过程包括: 加载,验证,准备,解析,初始化五个阶段。1.加载:在加载阶段,虚拟机需要完成以下三件事情:(1).通过一个类的全限定名来获取其定义的二进制字节流。(2).将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。(3).在Java堆中...

2020-03-20 14:51:04 327

原创 Java的类型擦除

泛型,即“参数化类型”。可以将类型当作参数传递给一个类或者是方法。创建集合时就指定集合元素的类型,该集合只能保存其指定类型的元素,避免使用强制类型转换。类型擦除是指:泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉。泛型擦除可以简单的理解为将泛型java代码转换为普通java代码。类型擦除的主要过程如下:一.将所有的泛型参数用其最左边界(最顶级的父类型)类...

2020-03-20 13:26:15 167 1

空空如也

空空如也

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

TA关注的人

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