Java知识梳理
梳理Java基础知识点
老胡 - laohu
这个作者很懒,什么都没留下…
展开
-
Java多线程之先行发生原则(happens-before)
前面介绍了Java内存模型及内存屏障相关概念,这篇文章接着介绍多线程编程另外一个比较重要的概念:先行发生原则(happens-before)。重要性happens-before是判断数据是否存在竞争,线程是否安全的主要依据,通过这个原则,我们可以解决并发环境下两个操作之间是否可能存在冲突的所有问题。happens-before是什么它Java内存模型中针对两项操作定义的偏序关系。例如操作A...原创 2019-06-12 22:03:56 · 479 阅读 · 0 评论 -
Java多线程之volatile关键字和内存屏障
前面一篇文章在介绍Java内存模型的三大特性(原子性、可见性、有序性)时,在可见性和有序性中都提到了volatile关键字,那这篇文章就来介绍volatile关键字的内存语义以及实现其特性的内存屏障。volatile是JVM提供的一种最轻量级的同步机制,因为Java内存模型为volatile定义特殊的访问规则,使其可以实现Java内存模型中的两大特性:可见性和有序性。正因为volatile关键字...原创 2019-05-31 10:53:01 · 1727 阅读 · 2 评论 -
Java多线程之Java内存模型
在介绍Java内存模型之前,我们先介绍一下计算机硬件的内存模型,因为JVM的并发和物理机器的并发很相似,甚至JVM并发操作中很多设计都是因为计算机系统的设计引发的。硬件的内存模型大家都知道计算机系统处理任务主要是靠处理器(CPU)来进行运算的,而运算中又会涉及到数据,数据在哪呢,数据自然是存储在计算机内存中,所以处理器在运算过程中不可避免的会涉及到与内存的读写交互,比如读取运算所需的数据,存储...原创 2019-05-29 22:46:46 · 5316 阅读 · 5 评论 -
多线程之:Synchronized与ReentrantLock
什么是线程安全保证多线程环境下共享的、可修改的状态的正确性。(这里的状态在程序中可以看作为数据)反着来说则是如果状态非共享、不可修改,也就不存在线程安全的问题保证线程安全的两种方法封装,通过封装将对象内部状态隐藏、保护起来不可变,将状态改为不可变,例如将状态定义为final线程安全要保证的基本特性原子性相关操作不会在中途被其他线程所干扰,一般通过同步机制实现可见性一个...原创 2018-10-26 11:17:44 · 310 阅读 · 0 评论 -
String、StringBuffer与StringBuilder
StringString的创建机制因为String在Java中使用过于频繁,Java为了避免在系统中产生大量的String对象,引入了字符串常量池的概念。 其运行机制是:创建一个字符串时,首先检查池中是否有值相同的字符串对象(equals决定),如果有则不需要创建而是直接从常量池中找到的该字符串对象的引用;如果没有则新建一个字符串对象,返回该对象引用,并且将新创建的字符串对象放...原创 2018-08-29 14:43:07 · 194 阅读 · 0 评论 -
强引用、软引用、弱引用、虚引用
在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用;Java中根据其生命周期的长短,将引用分为4类。强引用特点:我们平常典型编码Object obj = new Object()中的obj就是强引用。通过关键字new创建的对象所关联的引用就是强引用。 当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会...原创 2018-08-29 14:56:20 · 326 阅读 · 0 评论 -
Exception与Error
相同点Exception和Error都是继承自Throwable,在Java中只有Throwable的实例才可以被抛(throw)出或捕获(catch),它是java异常处理机制的基本组成类型。Exception和Error体现了Java平台设计者对不同异常情况的分类ExceptionException是程序正常运行中,可以预料的意外情况,可能并且应该被捕获从而进行相应的处理...原创 2018-08-29 16:19:09 · 288 阅读 · 0 评论 -
final、finally、finalize
finalfinal可以用来修饰类、方法、变量,修饰对象不同所代表的意义也不同 修饰类则代表该类不可继承扩展修饰方法则代表该方法不可重写修饰变量则代表该变量某种程度不可更改。为什么说是某种程度呢,因为这需要根据变量的类型来区分 如果修饰的变量是基本类型,则该变量赋值一次之后就无法修改,这是final就是不可变的标志如果修饰的变量是引用类型,那么该变量赋值一次之后,就无法修改该变量的...原创 2018-08-29 16:49:37 · 181 阅读 · 0 评论 -
Hash冲突解决方法
何为Hash冲突假设Hash表大小为5(即5个槽位),现在要把2,5,6,7,8这几个数存储到Hash表中,假设hash函数为hash(num)=num % size简单计算下,第一个数2的hash值为2所以放到第三个槽中,第二个数5的hash值为0放到第一个槽中,第三个数6的hash值为1放到第二个槽中,如下图所示: 1号槽 2号槽 3号槽 4号槽 5号槽...原创 2018-08-30 14:32:24 · 739 阅读 · 0 评论 -
Hashtable、HashMap、TreeMap
Hashtable、HashMap、TreeMap都是比较常见的一些Map实现,它们都是key-value键值对的形式存储和操作数据的容器类,同时他们的元素中不能有重复的key,一个key也只能映射一个value值。下面我从不同的维度来分别说说这三个集合,文章中涉及到的源码版本是JDK8底层数据结构Hashtable和HashMap底层都是采用数组存储数据TreeMap底层是采...原创 2018-08-30 17:45:51 · 288 阅读 · 0 评论