源码

spring源码学习之默认标签的解析(一)

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-25 07:18:34
  继续spring源码的学习之路,现在越来越觉得这个真的很枯燥的,而且我觉得要是自己来看源码,真的看不下去,不是没有耐心,而是真的没有头绪,我觉得结合着书来看,还是很有必要的,最起码大致的流程是能够捋清楚的,继续,希望自己能够坚持到最后! 一、标签解析的总体的理解 spring标签包括默认标签和自定义标签两种,今天只是来探索默认标签的! org.springframework.beans.factory.xml包下的DefaultBeanDefinitionDocumentReader类中 1 private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) { 2 // 对import标签的处理 3 if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) { 4 importBeanDefinitionResource(ele); 5 } 6 // 对alias标签的处理 7 else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) { 8 processAliasRegistration(ele); 9 } 10 // 对bean标签的处理 11 else if (delegate

JVM源码分析之javaagent原理完全解读

帅比萌擦擦* 提交于 2020-03-24 12:22:05
问题描述 当我们一个系统既需要mysql驱动,也需要oracle驱动的时候,在并发加载初始化这些驱动类的过程中产生死锁的可能性非常大,下面是一个模拟的例子,对于Thread2的实现其实是jdk里java.sql.DriverService的逻辑,也是我们第一次调用java.sql.DriverManager.registerDriver注册一个驱动实例要走的逻辑(jdk1.6下),不过这篇文章是使用我们生产环境的一个系统的线程dump和内存dump为基础进行分析展开的。 如果以上代码运行过程中发现有线程一直卡死在Class.forName的调用里,那么说明问题已经重现了。 先上两张图 内存态线程堆栈 线程堆栈 存疑点 仔细看看上面的线程dump分析和内存dump分析里的线程分析模块,您可能会有如下两个疑惑: 【为什么线程[Thread-0]一直卡在Class.forName的位置】:这有点出乎意料,做一个类加载要么找不到抛出ClassNotFoundException,要么找到直接返回,为什么会一直卡在这个位置呢? 【明明[Thread-0]注册的是mysql驱动为什么会去加载Odbc的驱动类】:通过[Thread-0]在栈上看倒数第二帧展开看到传入Class.forName的参数是com.mysql.jdbc.Driver,然后展开栈上顺序第二帧,看到传入的参数是sun.jdbc

开发直播源码的计算机语言以及开发完成后所需要做的工作

你离开我真会死。 提交于 2020-03-24 11:54:39
开发直播网站源码的三种计算机语言 直播网站源码开发所用的语言,根据未来运营平台不同,其选择也不同。一般来说,如果是PC后台,那么会采用PHP语言编写,如果是在安卓上开发,则选择Java语言,如果是在iOS上开发,则采用object-c语言编写。接下来,小编就简单介绍下这三种语言的优缺点,并适当的进行比较。 一、Java Java是一门计算机编程语言,和C++、Python等编程语言一样,Java如今依旧应用广泛。从我们日常用的安卓手机app到大部分网站到管理信息系统的应用服务器程序都是用Java这中语言来写的。之所以应用广泛,小编认为与Java能顺应面向对象这一主流的编程思想有很大的关系,将数据结构及其处理方法集成起来可以减少代码量,让程序员更多地把精力放在对程序的设计上,增加程序的功能性;同时包括了C类语言中指针、多继承等概念,引入了多线程、分布式与嵌入式概念,并且配合虚拟机的使用,让Java成为最佳的跨平台语言之一。 二、PHP PHP是Hypertext Preprocessor的缩写,是一种计算机脚本语言。脚本语言不需要像编程语言那样在编译时生成二进制可执行文件,而是直接对写好的PHP代码执行以达到效果。和脚本语言Java一样,PHP也是一种解释型语言,即可直接解释执行。所以与其说PHP是编程语言,不如说是一组命令。正因为它的“命令”特性,可嵌入到Html中

如何从github上clone项目源码-linux

限于喜欢 提交于 2020-03-23 18:30:55
前言 github是目前较为流行的代码托管网站,linux系统是目前开发人员较为常用的操作系统。项目实现的过程中用到一些经典好用的源代码,可以从github上clone,本文主要介绍linux系统命令行环境如何从github上clone源代码下载到本地。 系统环境 OS:ubuntu16.04; 操作步骤 1.确认系统是否正确安装git工具(命令行输入git可以查看相关命令),若没有安装,可以自行尝试安装; 2.在github上查看需要源码项目的URL地址 here ,复制项目地址以备后续使用; 3.在linux的命令行中输入 git clone URL地址 ,即可将项目源码clone到本地,等待clone完成; 4.clone完成即可在下载目录下看到clone的项目源码; 参考 1. linux如何从github上clone ; 完 来源: https://www.cnblogs.com/happyamyhope/p/8399405.html

SynchronousQueue 1.8 源码解析

ぐ巨炮叔叔 提交于 2020-03-23 16:16:20
[TOC] SynchronousQueue 1.8 源码解析 一,简介 SynchronousQueue 是一个很奇怪的队列,感觉都不能叫队列,因为内部没有数据的存储空间,队列不能peek,因为不存在元素,任何入队的线程都会阻塞,直到有线程来出队,也就是这个队列是一组操作,入队和出队要一起离开,出队也是一样,必须等入队,必须结伴而行;队列支持公平和非公平的模式(指的是队列匹配线程的顺序),公平模式的数据结构是队列(FIFO),非公平模式使用的是栈(LIFO)。 二,UML 图 三,基本成员 abstract static class Transferer<E> { // 出队入队都是这一个方法 abstract E transfer(E e, boolean timed, long nanos); } // npu数 static final int NCPUS = Runtime.getRuntime().availableProcessors(); // 带超时时间的自旋次数 static final int maxTimedSpins = (NCPUS < 2) ? 0 : 32; // 没有超时的自旋次数 static final int maxUntimedSpins = maxTimedSpins * 16; TransferStack 非公平的实现,主要成员

LinkedTransferQueue 1.8 源码解析

≯℡__Kan透↙ 提交于 2020-03-23 15:41:14
[TOC] LinkedTransferQueue 1.8 源码解析 一,简介 LinkedTransferQueue 是一个由链表结构组成的wujie阻塞传输队列,它是一个很多队列的结合体(ConcurrentLinkedQueue,LinkedBlockingQueue,SynchronousQueue),在除了有基本阻塞队列的功能(但是这个阻塞队列没有使用锁)之外;队列实现了TransferQueue接口重写了tryTransfer和transfer方法,这组方法和SynchronousQueue公平模式的队列类似,具有匹配的功能。 二,UML图 三,基本成员 // 是否是多核 private static final boolean MP = Runtime.getRuntime().availableProcessors() > 1; // 自旋次数 private static final int FRONT_SPINS = 1 << 7; // 前驱节点正在处理,当前节点需要自旋的次数 private static final int CHAINED_SPINS = FRONT_SPINS >>> 1; // 容忍清除节点失败次数的阈值 static final int SWEEP_THRESHOLD = 32; static final class Node { /

Java8 ConcurrentHashMap详解

怎甘沉沦 提交于 2020-03-23 15:38:24
#Java8 ConcurrentHashMap Java7 中实现的 ConcurrentHashMap 说实话还是比较复杂的,Java8 对 ConcurrentHashMap 进行了比较大的改动。建议读者可以参考 Java8 中 HashMap 相对于 Java7 HashMap 的改动,对于 ConcurrentHashMap,Java8 也引入了红黑树。 说实话,Java8 ConcurrentHashMap 源码真心不简单,最难的在于扩容,数据迁移操作不容易看懂。 我们先用一个示意图来描述下其结构: 结构上和 Java8 的 HashMap 基本上一样,不过它要保证线程安全性,所以在源码上确实要复杂一些。 ##初始化 // 这构造函数里,什么都不干 public ConcurrentHashMap() { } public ConcurrentHashMap(int initialCapacity) { if (initialCapacity < 0) throw new IllegalArgumentException(); int cap = ((initialCapacity >= (MAXIMUM_CAPACITY >>> 1)) ? MAXIMUM_CAPACITY : tableSizeFor(initialCapacity +

ConcurrentHashMap 源码浅析 1.7

落花浮王杯 提交于 2020-03-23 15:38:18
简介 (1) 背景 HashMap死循环:HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环获取Entry. HashTable效率低下:HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下.因为当一个线程访问HashTable的同步方法,其它线程也访问HashTable的同步方法时,会进入阻塞或轮询状态.如线程1使用put进行元素添加,线程2不但不能使用put方法添加元素,也不能使用get方法获取元素,所以竞争越激烈效率越低. (2) 简介 HashTable容器在竞争激烈的并发环境下表现出效率低下的原因是所有访问HashTable的线程都必须竞争一把锁,假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么多线程访问容器里不同的数据段时,线程间不会存在竞争,从而可以有效提高并发访问效率,这就是ConcurrentHash所使用的锁分段技术.首先将数据分成一段一段地储存,然后给每一段配一把锁,当一个线程占用锁访问其中一段数据时,其它段的数据也能被其它线程访问. 结构 ConcurrentHashMap是由Segments数组结构和HashEntry数组结构组成

ConcurrentHashMap源码解析

假如想象 提交于 2020-03-23 15:34:29
ConcurrentHashMap源码解析 [TOC] jdk8之前的实现原理 jdk8的实现原理 JDK8的实现已经抛弃了Segment分段锁机制,利用CAS+Synchronized来保证并发更新的安全,底层依然采用数组+链表+红黑树的存储结构。 变量解释 table:默认为null,初始化发生在第一次插入操作,默认大小为16的数组,用来存储Node节点数据,扩容时大小总是2的幂次方。 nextTable:默认为null,扩容时新生成的数组,其大小为原数组的两倍。 sizeCtl :默认为0,用来控制table的初始化和扩容操作,具体应用在后续会体现出来。 -1 代表table正在初始化 -N 表示有N-1个线程正在进行扩容操作 其余情况: 1、如果table未初始化,表示table需要初始化的大小。 2、如果table初始化完成,表示table的容量,默认是table大小的0.75倍,居然用这个公式算0.75(n - (n >>> 2))。 Node:保存key,value及key的hash值的数据结构。 ForwardingNode:一个特殊的Node节点,hash值为-1,其中存储nextTable的引用。只有table发生扩容的时候,ForwardingNode才会发挥作用,作为一个占位符放在table中表示当前节点为null或则已经被移动。 初始化