JDK
文章平均质量分 82
_吹雪_
这个作者很懒,什么都没留下…
展开
-
JDK 7 的 ConcurrentHashMap 高并发性的实现机制
Java 内存模型由于 ConcurrentHashMap 是建立在 Java 内存模型基础上的,为了更好的理解 ConcurrentHashMap,让我们首先来了解一下 Java 的内存模型。 下面我们将分别介绍 Java 内存模型的重排序,内存可见性和 happens-before 关系。重排序重排序后的指令,对于优化执行以及成熟的全局寄存器分配算法的使用,都是大有脾益的,它...原创 2018-06-25 23:45:37 · 203 阅读 · 0 评论 -
Java之HashMap的演进
1. 摘要HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等(8的ConcurrentHashMap也引入的红黑树)。 本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。2. 简介Java为数据结构中的映射定义了一个接口java.u...转载 2018-06-26 23:54:32 · 411 阅读 · 0 评论 -
Java之ConcurrentHashMap的演进
1. 线程不安全的HashMap本节的代码均基于JDK 1.7.0_67 HashMap是非线程安全的,HashMap的线程不安全主要体现在resize时的死循环及使用迭代器时的fast-fail上。1.1 HashMap工作原理1.1.1 HashMap寻址方式对于新插入的数据或者待读取的数据,HashMap将Key的哈希值对数组长度取模,结果作为该Entry在数组中的...转载 2018-06-26 23:59:31 · 179 阅读 · 0 评论 -
Java之Lock的实现原理
0. 前言与synchronized不同的是,Lock完全用Java写成,在java这个层面是无关JVM实现的。 在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),其实现都依赖java.util.concurrent.AbstractQueue...转载 2018-07-15 17:48:06 · 299 阅读 · 0 评论 -
Java并发之AQS详解
1. 概述谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)! 类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch…。以下是本文的目录大纲: * 概...转载 2018-08-05 17:31:44 · 246 阅读 · 0 评论 -
Java 集合小结
1.List 1.1 ArrayList以数组实现。节约空间,但数组有容量限制。超出限制时会增加50%容量,用System.arraycopy()复制到新的数组。因此最好能给出数组大小的预估值。默认第一次插入元素时创建大小为10的数组。按数组下标访问元素-get(i)、set(i,e) 的性能很高,这是数组的基本优势。如果按下标插入元素、删除元素-add(i,e)、 remov...转载 2016-08-14 19:49:44 · 439 阅读 · 0 评论 -
Java CAS原理
引言独占锁:是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。乐观锁:每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止。在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁。锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引...原创 2016-09-05 11:23:26 · 838 阅读 · 0 评论 -
ABA问题
CAS算法实现一个重要前提需要取出内存中某时刻的数据,而在下时刻比较并替换,那么在这个时间差类会导致数据的变化。比如说一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且two进行了一些操作变成了B,然后two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中仍然是A,然后one操作成功。尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的...转载 2016-09-05 12:32:35 · 5105 阅读 · 1 评论 -
HashMap使用小结
1. 简介HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap。 2. 内部实现从结构实现来讲,HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的。从源码...原创 2017-02-18 13:12:10 · 496 阅读 · 0 评论 -
Java 常量池理解与总结(转摘)
1.相关概念 1.1 什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。 1.2 Class文件中的常量池在Class文件结构中,最头的4个字节用于存储魔数Magic Number,用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,...原创 2017-03-05 10:07:15 · 369 阅读 · 0 评论 -
String#intern方法总结
0. 引言在 JAVA 语言中有8中基本类型和一种比较特殊的类型String。这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念。常量池就类似一个JAVA系统级别提供的缓存。 8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊。它的主要使用方法有两种:直接使用双引号声明出来的String对象会直接存储在常量池中。如果不是用双引号声明的...原创 2017-03-05 10:38:39 · 360 阅读 · 0 评论 -
Java之ConcurrentSkipList
Skip list(跳表)是一种可以代替平衡树的数据结构,默认是按照Key值升序的。Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过“空间来换取时间”的一个算法,在每个节点中增加了向前的指 针,在插入、删除、查找时可以忽略一些不可能涉及到的结点,从而提高了效率。 从概率上保持数据结构的平衡比显示的保持数据结构平衡要简单的多。对于大多数应用,用Ski...原创 2018-06-17 12:27:50 · 2062 阅读 · 0 评论 -
InheritableThreadLocal的使用
InheritableThreadLocal是ThreadLocal的子类。该类扩展了 ThreadLocal,为子线程提供从父线程那里继承的值:在创建子线程时,子线程会接收所有可继承的线程局部变量的初始值,以获得父线程所具有的值。通常,子线程的值与父线程的值是一致的;但是,通过重写这个类中的 childValue 方法,子线程的值可以作为父线程值的一个任意函数。当必须将变量(如用户 ID 和 事...转载 2018-06-17 12:43:55 · 627 阅读 · 0 评论 -
Java 之 Arrays.asList 的坑
1 引子public static void main(String[] args) { String[] sArray = {"a", "b", "c", "d", "e"}; List<String> sList = Arrays.asList(s原创 2018-06-21 23:34:16 · 525 阅读 · 0 评论 -
Java未开源的Unsafe类
0. 前言Unsafe类可以为我们提供高效并且线程安全方式操作变量,直接和内存数据打交道。1. 获取Unsafe实体的方法private static Unsafe getUnsafeInstance() throws SecurityException, NoSuchFieldException, IllegalArgumentException, ...原创 2018-07-20 08:41:04 · 399 阅读 · 0 评论 -
JDK 线程池使用小结
我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。线程池可以使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务! 1.Java中的ThreadPoolExecutor类java....原创 2016-08-14 20:17:21 · 651 阅读 · 0 评论 -
Java之Integer#highestOneBit代码品读
/** * Returns an {@code int} value with at most a single one-bit, in the * position of the highest-order ("leftmost") one-bit in the specified * {@code int} value. Returns zero if the specified va...原创 2018-10-12 19:52:35 · 404 阅读 · 0 评论