随笔分类 - Java基础
摘要:请注意以下标红的都为重点,重点,重点(重要的事情说三遍~): 1. 当一个类继承于另一个类,子类中没有父类的方法时。用子类的对象调用方法时,会首先在子类中查找,如果子类中没有改方法,再到父类中查找。 2. 当一个方法只在父类中定义时,调用该方法时会使用父类中的属性。如果该方法中又调用了其他方法,那么
阅读全文
摘要:构造方法 ArrayBlockingQueue 提供了三个构造方法,分别如下。 capacity: 表示数组的长度,也就是队列的长度fair:表示是否为公平的阻塞队列,默认情况下构造的是非公平的阻塞队列。 其中第三个构造方法就不解释了,它提供了接收一个几个作为数据初始化的方法: public Arr
阅读全文
摘要:生产者消费者的实际使用 我相信大家都有使用过分布式消息队列,比如 ActiveMQ、kafka、RabbitMQ 等等,消息队列的是有可以使得程序之间实现解耦,提升程序响应的效率。如果我们把多线程环境比作是分布式的话,那么线程与线程之间是不是也可以使用这种消息队列的方式进行数据通信和解耦呢? 阻塞队
阅读全文
摘要:AQS 是什么 在 Lock 中,用到了一个同步队列 AQS,全称 AbstractQueuedSynchronizer,它是一个同步工具也是 Lock 用来实现线程同步的核心组件。如果你搞懂了 AQS,那么 J.U.C 中绝大部分的工具都能轻松掌握。 AQS 的两种功能 从使用层面来说,AQS 的
阅读全文
摘要:紧接上篇~ 数据迁移阶段的实现分析 通过分配好迁移的区间之后,开始对数据进行迁移。在看这段代码之前,先来了解一下原理: synchronized (f) {//对数组该节点位置加锁,开始处理数组该位置的迁移工作 if (tabAt(tab, i) == f) {//再做一次校验 Node<K, V>
阅读全文
摘要:紧接上篇 CounterCells 初始化图解 初始化长度为 2 的数组,然后随机得到指定的一个数组下标,将需要新增的值加入到对应下标位置处: transfer 扩容阶段 判断是否需要扩容,也就是当更新后的键值对总数 baseCount >= 阈值 sizeCtl 时,进行 rehash,这里面会有
阅读全文
摘要:这篇随笔的篇幅长,所以分为上、中、下三篇,内容紧接上篇,如果有兴趣可自己抽空揣摩,有错误的地方可以指正。 ConcurrentHashMap 的初步使用及场景 CHM 的使用 ConcurrentHashMap 是 J.U.C 包里面提供的一个线程安全并且高效的 HashMap,所以Concurre
阅读全文
摘要:Condition.signal await 方法会阻塞 ThreadA,然后 ThreadB 抢占到了锁获得了执行权限,这个时候在 ThreadB 中调用了 Condition的 signal()方法,将会唤醒在等待队列中节点。 public final void signal() { if (!
阅读全文
摘要:在前面学习 synchronized 的时候,有讲到 wait/notify 的基本使用,结合 synchronized 可以实现对线程的通信。那么这个时候我就在思考了,既然 J.U.C 里面提供了锁的实现机制,那 J.U.C 里面有没有提供类似的线程通信的工具呢? 于是找阿找,发现了一个 Cond
阅读全文
摘要:本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有值传递,有的博客说两者皆有;这让人有点摸不着头脑,下
阅读全文
摘要:例如: String str1 = "ABC" String str2 = new String("ABC"); String str1 = "ABC"; 可能创建一个对象或者不创建对象。 如果"ABC" 这个字符串z在java String池中不存在,会在java String池中创建一个Stri
阅读全文