随笔分类 -  【JDK源码学习】

摘要:双向循环链表 双向循环链表和双向链表的不同在于,第一个节点的pre指向最后一个节点,最后一个节点的next指向第一个节点,也形成一个“环”。 而LinkedList就是基于双向循环链表设计的。 " " LinkedList 的继承关系 LinkedList 是一个继承于AbstractSequent 阅读全文
posted @ 2019-01-11 12:22 西北野狼 编辑
摘要:一: submit()方法,可以提供Future 类型的返回值。 executor()方法,无返回值。 execute无返回值 _ _ _ 二: excute方法会抛出异常。 sumbit方法不会抛出异常。除非你调用Future.get()。 _ _ _ 三: excute入参Runnable su 阅读全文
posted @ 2018-10-13 23:49 西北野狼 编辑
摘要:乐观锁和悲观锁 Synchronized属于 悲观锁 ,悲观地认为程序中的并发情况严重,所以严防死守。CAS属于 乐观锁 ,乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新。 性能对比: Synchronized关键字会让没有得到锁资源的线程进入blocked状态,而后在争夺到锁资源后 阅读全文
posted @ 2018-07-01 00:44 西北野狼 编辑
摘要:深入学习semaphore 控制同时访问资源线程数 访问特定资源前,先使用acquire(1)获得许可,如果许可数量为0,该线程则一直阻塞,直到有可用许可。 访问资源后,使用release()释放许可。 demo: 非公平策略 acquire实现,核心代码如下: java final int non 阅读全文
posted @ 2018-05-24 10:10 西北野狼 编辑
摘要:Hashmap在并发环境下,可能出现的问题: 1、多线程put时可能会导致get无限循环,具体表现为CPU使用率100%; 原因:在向HashMap put元素时,会检查HashMap的容量是否足够,如果不足,则会新建一个比原来容量大两倍的Hash表,然后把数组从老的Hash表中迁移到新的Hash表 阅读全文
posted @ 2018-05-08 14:57 西北野狼 编辑
摘要:ArrayList 总体介绍 ArrayList 实现了 List 接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入 元素,底层通过 数组实现 。除该类未实现同步外,其余跟 Vector 大致相同。每个 ArrayList 都有一个容量(capacity),表示底层数组的实际大小,容器 阅读全文
posted @ 2018-03-25 22:56 西北野狼 编辑
摘要:Hashtable同样是基于哈希表实现的,同样每个元素是一个key value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。 Hashtable同样实现了Serializable接口,它 阅读全文
posted @ 2018-03-11 15:00 西北野狼 编辑
摘要:采用LRU算法实现的话就是将最老的数据删掉。利用LRU缓存,我们能够提高系统的性能. 一,是它本身已经实现了按照访问顺序的存储,也就是说,最近读取的会放在最前面,最不常读取的会放在最后(当然,它也可以实现按照插入顺序存储)。 二,LinkedHashMap本身有一个方法用于判断是否需要移除最不常读取 阅读全文
posted @ 2018-02-07 17:40 西北野狼 编辑
摘要:概述: LinkedHashMap实现Map继承HashMap,基于Map的哈希表和链该列表实现,具有可预知的迭代顺序。 LinedHashMap维护着一个运行于所有条目的双重链表结构,该链表定义了迭代顺序,可以是插入或者访问顺序。 LintHashMap的节点对象继承HashMap的节点对象,并增 阅读全文
posted @ 2017-09-28 11:27 西北野狼 编辑
摘要:hashMap数据结构图: HashMap特点: 允许多条记录的值为null; 非线程安全,任意时刻多线程操作hashmap,有可能导致数据不一致,可以通过Collections的synchronizedMap来实现Map的线程安全或者使用concurrentHashMap。 HashMap是链表+ 阅读全文
posted @ 2017-09-13 21:26 西北野狼 编辑