06 2020 档案
摘要:再谈 IOC 与 DI IOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们所看到的配置
阅读全文
摘要:12、载入<bean>元素 Bean 配置信息中的<import>和<alias>元素解析在 DefaultBeanDefinitionDocumentReader 中已经完成,对 Bean 配置信息中使用最多的<bean>元素交由 BeanDefinitionParserDelegate 来解析,
阅读全文
摘要:6、分配路径处理策略 在 XmlBeanDefinitionReader 的抽象父类 AbstractBeanDefinitionReader 中定义了载入过程。AbstractBeanDefinitionReader 的 loadBeanDefinitions()方法源码如下: AbstractR
阅读全文
摘要:IOC 容器的初始化包括 BeanDefinition 的 Resource 定位、加载和注册这三个基本的过程。我们以ApplicationContext 为例讲解,ApplicationContext 系列容器也许是我们最熟悉的,因为 Web 项目中使用的 XmlWebApplicationCon
阅读全文
摘要:开门见山,今天解决的问题就是:如何判断两个链表是否相交?如果相交,则需要得到交点。(下面一步步跟着博主仔细想就会明白了~) 首先构建链表节点信息: //链表节点 public class DataNode { private int data; private DataNode next; publ
阅读全文
摘要:所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D(方法C在方法D中),D这个方法就叫回调方法。 举个例子: 有一天小王遇到一个很难的问题,问题是“1 + 1 = ?”,就打电话问小李,小李一下子也不知道,就跟小王说,等我办完手上的事情,就去想想答案,小王也不会傻傻的拿着
阅读全文
摘要:Java 中静态代码块初始化问题测试 情况一:变量是 static final 修饰的“编译期常量”,如 public static final String a = "JD"; public class Test { public static void main(String[] args) {
阅读全文
摘要:请注意以下标红的都为重点,重点,重点(重要的事情说三遍~): 1. 当一个类继承于另一个类,子类中没有父类的方法时。用子类的对象调用方法时,会首先在子类中查找,如果子类中没有改方法,再到父类中查找。 2. 当一个方法只在父类中定义时,调用该方法时会使用父类中的属性。如果该方法中又调用了其他方法,那么
阅读全文
摘要:一、线性探测再散列法 Hash表: 元素的值(value)和在数组中索引位置(index)有一个确定关系 Index = Hash(key) ==> y = f(x) Index有可能相同,怎么处理冲突? 在“处理冲突”上可能会有不同的方法。 示例 : 将关键字序列(7、8、30、11、18、9、1
阅读全文
摘要:主要是在项目中(中小型项目) 有支付下单业务(只是办理下单,没有涉及到商品库存),目前用户量还没有上来,没有出现问题,但是想到如果用户量变大,下单并发量变大,可能会出现一系列的问题,趁着空闲时间,做了这个demo测试相关问题。 可能遇到的问题如下: 1.订单重复 2.高并发下,性能变慢 解决方式:T
阅读全文
摘要:很多朋友应该关注到了。线程池的执行任务有两种方法,一种是 submit、一种是 execute; 这两个方法是有区别的,那么基于这个区别我们再来看看。 execute 和 submit 区别 1. execute 只可以接收一个 Runnable 的参数 2. execute 如果出现异常会抛出 3
阅读全文
摘要:本文主要讲解线程池的完成服务: CompletionService接口定义了一组任务管理接口: 1.submit() - 提交任务; 2.take() - 获取任务结果; 3.poll() - 获取任务结果 ExecutorCompletionService类是CompletionService接口
阅读全文
摘要:紧接上篇~ addWorkerFailed addWorker 方法中,如果添加 Worker 并且启动线程失败,则会做失败后的处理。 这个方法主要做三件事: 1. 如果 worker 已经构造好了,则从 workers 集合中移除这个 worker。 2. 原子递减核心线程数(因为在 addWor
阅读全文
摘要:线程池原理篇幅太长,所以博主分为上、下两章节讲解,望有兴趣的朋友慢慢阅读~ 什么是线程池 在 Java 中,如果每个请求到达就创建一个新线程,创建和销毁线程花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。如果在一个 Jvm 里创建太多的线程,可能会使系统由于
阅读全文
摘要:构造方法 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
阅读全文
摘要:CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续工作。 CyclicBarrier 默认的构造方法是 CyclicBar
阅读全文
摘要:semaphore 也就是我们常说的信号灯,semaphore 可以控制同时访问的线程个数,通过 acquire 获取一个许可,如果没有就等待,通过 release 释放一个许可。有点类似限流的作用。叫信号灯的原因也和他的用处有关,比如某商场就 5 个停车位,每个停车位只能停一辆车,如果这个时候来了
阅读全文
摘要:今天博主来讲解下J.U.C下的countdownlatch,它 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行。从命名可以解读到 countdown 是倒数的意思,类似于我们倒计时的概念。countdownlatch 提供了两个方法,一个是 countDown,一个
阅读全文
摘要:Condition.signal await 方法会阻塞 ThreadA,然后 ThreadB 抢占到了锁获得了执行权限,这个时候在 ThreadB 中调用了 Condition的 signal()方法,将会唤醒在等待队列中节点。 public final void signal() { if (!
阅读全文
摘要:在前面学习 synchronized 的时候,有讲到 wait/notify 的基本使用,结合 synchronized 可以实现对线程的通信。那么这个时候我就在思考了,既然 J.U.C 里面提供了锁的实现机制,那 J.U.C 里面有没有提供类似的线程通信的工具呢? 于是找阿找,发现了一个 Cond
阅读全文
摘要:一 .数组 数组(Array) 是一种很常见的数据结构。它是由相同类型的元素(element)的集合所组成,并且被分配一块连续的内存来存储(与链表对比),利用元素的索引(index)可以计算出该元素对应的存储地址。 它的特点是提供随机访问并且容量有限。 假如数组的长度为 n 访问:O(1)//访问特
阅读全文
摘要:遍历概念: 前序遍历:先访问根节点——左子树——右子树。 中序遍历:先访问左子树——根节点——右子树,按照这个顺序。 后序遍历:和前面差不多,先访问树的左子树——右子树——根节点。 以下是代码: 构建二叉树和根节点 前序遍历(递归与非递归): 中序后序同上 测试 : 测试结果:
阅读全文
摘要:JVM性能调优: Tomcat本身还是运行在JVM上的,通过对JVM参数的调整我们可以使Tomcat拥有更好的性能。目前针对JVM的调优主要有两个方面:内存调优和垃圾回收策略调优。 所以归纳为以下: 总体架构 主要的组件 执行过程 tomcat 调优 :可以考虑从内存,并发,缓存,安全,网络,系统等
阅读全文
摘要:1. 什么是OOM? OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError。 看下关于的官方说明: Thrown when the Java Virtual Machine cannot allocate an obje
阅读全文
摘要:本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨论的话题又是充满争议:有的论坛帖子说Java只有值传递,有的博客说两者皆有;这让人有点摸不着头脑,下
阅读全文
摘要:例如: String str1 = "ABC" String str2 = new String("ABC"); String str1 = "ABC"; 可能创建一个对象或者不创建对象。 如果"ABC" 这个字符串z在java String池中不存在,会在java String池中创建一个Stri
阅读全文
摘要:问题 (1)volatile是如何保证可见性的? (2)volatile是如何禁止重排序的? (3)volatile的实现原理? (4)volatile的缺陷? 简介 volatile可以说是Java虚拟机提供的最轻量级的同步机制了,但是它并不容易被正确地理解,以至于很多人不习惯使用它,遇到多线程问
阅读全文
摘要:本文导航: 获取锁 释放锁 公平锁与非公平锁 ReentrantLock 与 synchronized 的区别 参考资料 ReentrantLock,JUC提供的可重入锁,是一种递归无阻塞的同步机制。 它可以等同于 synchronized 的使用,但是提供了比 synchronized 更强大、更
阅读全文
摘要:本篇主要是对Java并发中synchronized关键字进行较为深入的探索,这些知识点结合博主对synchronized的个人理解以及相关的书籍的讲解(在结尾参考资料),如有误处,欢迎留言。 本文导航: synchronized的三种应用方式 synchronized作用于实例方法 synchron
阅读全文