首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏WriteOnRead

    JDK源码分析-AbstractQueuedSynchronizer(2)

    概述 前文「JDK源码分析-AbstractQueuedSynchronizer(1)」初步分析了 AQS,其中提到了 Node 节点的「独占模式」和「共享模式」,其实 AQS 也主要是围绕对这两种模式的操作进行的 使当前线程休眠(park); 2. 返回该线程是否被中断(其他线程对其发过中断信号)。 2. 将 node 节点设置为取消(CANCELLED)状态; 2. 相关阅读: JDK源码分析-AbstractQueuedSynchronizer(1) JDK源码分析-Lock&Condition Stay hungry, stay foolish.

    54810发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-TreeMap(2)

    前文「JDK源码分析-TreeMap(1)」分析了 TreeMap 的一些方法,本文分析其中的增删方法。这也是红黑树插入和删除节点的操作,由于相对复杂,因此单独进行分析。 case2: 关注节点为 a,它的叔叔节点 d 是黑色,a 是其父节点 b 的右子节点 ? case3: 关注节点是 a,它的叔叔节点 d 是黑色,a 是其父节点 b 的左子节点 ? case2: 关注节点的兄弟节点是黑色,且兄弟节点的子节点都是黑色 ? case3: 关注节点的兄弟节点是黑色,且左子节点是红色、右子节点是黑色 ? 勘误:前文「数据结构与算法笔记(四)」对红黑树删除操作第四种情况的分析不够准确,近两天又参考了其他文章及代码,这里的 case4 是目前经分析认为比较准确的(符合 JDK 1.8 源码中 TreeMap 相关阅读: JDK源码分析-TreeMap(1) 数据结构与算法笔记(四) Stay hungry, stay foolish.

    44030发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-HashMap(2)

    前文「JDK源码分析-HashMap(1)」分析了 HashMap 的内部结构和主要方法的实现原理。但是,面试中通常还会问到很多其他的问题,本文简要分析下常见的一些问题。 这里再贴一下 HashMap 内部的结构图(JDK 1.8): ? FAQ: Q1: HashMap 是否线程安全?为什么? 首先 HashMap 是线程不安全的。 这一点很多人应该都了解,HashMap 源码中也有说明。但是为什么说不安全?体现在哪里呢?下面通过两个例子简要进行分析(可能不够全面,仅做参考)。 PS: 细心阅读 HashMap 源码的话可以发现,结构性修改的方法中都会有如下一行代码: ++modCount; 该值就是用来记录结构性修改的次数。 参考链接: https://www.jianshu.com/p/7af5bb1b57e2 相关阅读: JDK源码分析-HashMap(1) Stay hungry, stay foolish.

    35420发布于 2019-08-16
  • 来自专栏云计算运维

    从概述到HelloWorld,含JDK配置、源码2

    2、 用记事本打开HelloWorld.java文件,输写程序内容。

    26230发布于 2021-07-15
  • 来自专栏WriteOnRead

    JDK 源码 - 前言

    以前读过一些 JDK 常用的源码。当时的做法是在 IDE 打开源码文件,同时打开官方文档和谷歌翻译,一边读一边翻译,那时觉得还颇有收获。但是,由于基础薄弱,为了加快速度,有很多不理解的地方跳过了。 2. JUC 包 即 java.util.concurrent 包下的部分常用类,这部分在多线程编程中常用的。

    41730发布于 2019-08-16
  • 来自专栏代码人生

    jdk源码-HashMap

    结构:数组 +(链表/红黑树) 方式:indexOf定位数组下标,根据下标链表+ 扩容条件:当hashMap的数据到警戒值 size*0.75,就会扩容,数组*2 构造方法:阀值默认0.75f hashMap

    49120发布于 2019-10-30
  • JDK源码解读:CountDownLatch源码解析

    常用方法 await阻塞当前线程源码 public void await() throws InterruptedException { sync.acquireSharedInterruptibly 【2】await(long timeout, TimeUnit unit) 这个方法与基本的 await() 方法类似,但它增加了一个超时参数。 这个区别,就是 await(long timeout, TimeUnit unit) 多了一个超时判断步骤,所在源码如下: public final boolean tryAcquireSharedNanos 取消申请 countDown:倒计时源码 public void countDown() { sync.releaseShared(1); } public 如果倒计时到0了,则进行释放倒计时 源码分析: 【1】会回调CountDownLatch#Sync的tryReleaseShared方法 protected boolean tryReleaseShared

    60700编辑于 2024-11-20
  • 来自专栏WriteOnRead

    JDK源码分析-PriorityBlockingQueue

    概述 前文「JDK源码分析-PriorityQueue」分析了优先队列 PriorityQueue,它既不是阻塞队列,而且线程不安全。 2. 释放锁之后如何保证线程安全? 这就用到了成员变量 allocationSpinLock,使用了 Unsafe 类的 CAS 操作。 PriorityBlockingQueue 是优先队列的阻塞方式实现,它与 PriorityQueue 内部结构类似,即物理结构是可变数组、逻辑结构是堆; 2. juejin.im/post/5cc258796fb9a03228616e6e https://blog.csdn.net/codejas/article/details/89190774 相关阅读: JDK 源码分析-PriorityQueue JDK源码分析-ReentrantLock Stay hungry, stay foolish.

    49630发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-Collection

    很多方法都能见名知意,这里简要分析一下: 1. size(): 集合中包含的元素个数; 2. isEmpty(): 集合是否为空; 3. contains(Object): 集合中是否包含某个对象; 4 super E>): 从该集合中移除满足指定条件的元素,其中 Predicate 是 JDK 1.8 引入的函数式操作,即传入的参数是一个方法; 12. retainAll(Collection<? 16. spliterator(): 可分割迭代器,用于并行遍历集合中的元素(iterator() 方法是顺序遍历); 17. stream() & parallelStream(): JDK 1.8 super T>) 方法,该方法也是 JDK 1.8 引入的,提供遍历集合元素的函数式操作。 PS: JDK 版本如下: ? 阅读源码时,个人以为应该先读接口类,而非具体的实现类。原因有二: 1. 2. 从代码量看,接口类代码较少。实现类的代码一般较多,如果初读源码就钻到实现类,可能容易被搞蒙。 Stay hungry, stay foolish

    66520发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-ThreadPoolExecutor

    概述 ThreadPoolExecutor 是 JDK 中线程池的实现类,它的继承结构如下: ? 源码分析-BlockingQueue」的分析。 * * 2. 2. 若运行的线程数不小于 corePoolSize,则将新来的任务添加到任务队列(workQueue)。 源码分析-ReentrantLock」分析。

    56920发布于 2019-08-30
  • 来自专栏WriteOnRead

    JDK源码分析-Semaphore

    具体可参考前文对 AQS 共享模式的分析「JDK源码分析-AbstractQueuedSynchronizer(3)」。 即同时最多有 2 个线程可以获取到 Semaphore semaphore = new Semaphore(2); for (int i = 0; i < 50; i++) { Thread-2 正在执行.. . */ 这里把 Semaphore 的初始许可值设为 2,表示最多有两个线程可同时获取到许可(运行程序可发现线程是两两一起执行的)。设置为其他值也是类似的。 相关阅读: JDK源码分析-AbstractQueuedSynchronizer(3) Stay hungry, stay foolish.

    54520发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-CountDownLatch

    ; } 其中,acquireSharedInterruptibly、tryAcquireSharedNanos 和 releaseShared 都是 AQS 中「共享模式」的方法,具体代码可参考前文「JDK 源码分析-AbstractQueuedSynchronizer(3)」的分析。 Thread-2 is working .. Thread-3 is working .. Thread-4 is working .. . */ 场景 2:一个线程到达指定条件后,通知另一个线程 private static volatile List<Integer> list = new ArrayList<>(); private 相关阅读: JDK源码分析-AbstractQueuedSynchronizer(3) Stay hungry, stay foolish.

    46920发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-LinkedList

    结点类 Node 查看 LinkedList 的源码可发现它内部有个嵌套类 Node,代码如下: private static class Node<E> { E item; // 存储的数据 分析以下场景: 若有线程 T1 对 LinkedList 进行遍历,同时线程 T2 对其进行结构性修改。 LinkedList 内部是「双向链表」,同时实现了 List 接口和 Deque 接口,因此也具备 List、双端队列和栈的性质; 2. 线程不安全。 相关阅读: JDK源码-Queue, Deque Stay hungry, stay foolish.

    40020发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-CyclicBarrier

    Thread-2 is reading.. Thread-1 start writing.. --------- Thread-3 is reading..

    47420发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-LinkedHashMap

    概述 前文「JDK源码分析-HashMap(1)」分析了 HashMap 主要方法的实现原理(其他问题以后分析),本文分析下 LinkedHashMap。 构造器 2、3、4、5: public LinkedHashMap(int initialCapacity) { super(initialCapacity); accessOrder obama=b, trump=c, lincoln=d} 指定 LinkedHashMap 的顺序为访问顺序: Map<String, String> map = new LinkedHashMap<>(2, (lruCache); // 输出结果: // {obama=b, trump=c} 这里定义的 LRUCache 类中,对 removeEldestEntry 方法进行了重写,当缓存中的容量大于 2, LinkedHashMap 继承自 HashMap,其结构可以理解为「双链表 + 散列表」; 2. 可以维护两种顺序:插入顺序或访问顺序; 3. 可以方便的实现 LRU 缓存; 4.

    49520发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-Hashtable

    Entry<K,V>)newMap[index]; newMap[index] = e; } } } 扩容操作,若 index 位置为链表,且插入顺序为 1、2、 3,则在该位置的存储顺序为 3、2、1。 扩容时,会从前往后读取元素并操作,因此扩容后的顺序为 3、2、1。示意图: ? Hashtable 是散列表的实现,处理散列冲突使用的是链表法,内部结构可以理解为「数组 + 链表」; 2. 默认初始化容量为 11,默认负载因子为 0.75; 3. 相关阅读: JDK源码分析-HashMap(1) Stay hungry, stay foolish.

    53710发布于 2019-08-16
  • 来自专栏彤哥读源码

    如何阅读jdk源码

    简介 这篇文章主要讲述jdk本身的源码该如何阅读,关于各种框架的源码阅读我们后面再一起探讨。 笔者认为阅读源码主要包括下面几个步骤。 设定目标 凡事皆有目的,阅读源码也是一样。 (2)问互联网 很多问题可能自己也想不到,那就需要上网大概查一下相关的博客,看人家有没有提出什么问题。 或者,查询相关面试题。 jdk8对jdk7作了哪些优化? (3)不断发现问题 在源码阅读的过程中,可能看着看着就遇到个问题,这是非常常见的,这种问题也应该保留下来研究研究。 jdk源码还是比较好阅读的,如果后面看spring的源码,做不到忽略不必要的细节,真的是会迷失的,先埋个伏笔哈~~ 举个例子,之前阅读过ArrayList的序列化相关的代码中的readObject()方法 (2)纵向比较 可以从集合发展的历史进行比较。

    73121发布于 2019-07-08
  • 来自专栏二进制文集

    JDK源码分析 异常

    说明 对于JDK源码分析的文章,仅仅记录我认为重要的地方。源码的细节实在太多,不可能面面俱到地写清每个逻辑。 所以我的JDK源码分析,着重在JDK的体系架构层面,具体源码可以参考:http://www.cnblogs.com/skywang12345/category/455711.html。 (jdk.java:383) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ... Frank Yellin * @see java.lang.Error * @jls 11.2 Compile-Time Checking of Exceptions * @since JDK1.0 */ public class Exception extends Throwable { Error 源码分析 Error 最重要的意义,在于 JVM 对它的约定。

    1.1K40发布于 2018-10-08
  • 来自专栏WriteOnRead

    JDK源码分析-DelayQueue

    DelayQueue 是一种队列,同时实现了 BlockingQueue 接口; 2. 它内部的元素有延迟时间的概念,出队时,若延时未到,则无法读取到队列头部的元素; 3. 它是线程安全的。

    49120发布于 2019-10-16
  • 来自专栏开源君

    JDK源码阅读指南

    JDK源码阅读指南 Read The Fucking Source Code  ---- RTFM源码面前,了无秘密  ---- 侯捷 背景 今天逛GitHub,发现了一个神级项目,作者将主要整理/记录阅读 JDK源码时的理解与体会分享出来,便于大家学习。 项目截图 [JDK中java.time.year中的源码说明] [在这里插入图片描述] 项目食用指南 项目中包含多个分支,主分支命名为master,测试分支命名为test,源码/笔记分支以JDK-X(X master分支不定期汇总源码笔记与测试代码的快照。 JDK-X分支存放JDK源码与笔记。阅读过程中产生的笔记以注释的形式直接写在源码文件中。 test分支存放辅助理解的测试代码,可直接运行。 阅读源码时请切换到JDK-X分支,且不需要关联JDK。 测试源码时请切换到test分支,此时需要关联OracleJDK/OpenJDK。

    2.7K00发布于 2021-03-21
领券