并发程序设计之Future模式 一).使用Future模式的原因 当某一段程序提交了一个请求,期待得到一个答复,但服务程序对这个请求的处理可能很慢,在单线程的环境中,调用函数是同步的,必须等到服务程序返回结果后才能进行其他处理,在这段时间里,客户端一直处于等待状态. 二).Future模式 使用并发的设计思想,解决客户端发送请求到应用程序,等待响应数据时间过长的问题. 三).Future模式的核心结构 1.main: 系统启动类 作用:调用Client,发送请求. 2.client: 发送请求类…
经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习之AQS框架(一)概述> <Java并发包源码学习之AQS框架(二)CLH lock queue和自旋锁> <Java并发包源码学习之AQS框架(三)LockSupport> 分析源码是非常枯燥乏味的一件事,其实代码本身其实就是最好的说明了,因此基本都是贴出一些代码加上一些注释,…
Springboot学习04-默认错误页面加载机制源码分析 前沿 希望通过本文的学习,对错误页面的加载机制有这更神的理解 正文 1-Springboot错误页面展示 2-Springboot默认错误处理逻辑 1-将请求转发到BasicErrorController控制器来处理请求, 2-浏览器请求响应BasicErrorController的errorHtml()方法,APP等客户端响应error()方法 3-以浏览器的404错为例:最终返回一个modelAndView 3-1-调用BasicE…
介绍一下struts2内置帮我们封装好的处理结果方式也就是底层源码分析 这是我们的jar包里面找的位置目录 打开往下拉看到result-type节点 name那一列就是我们的type类型取值 上一篇博客在分析的时候发现就算不写也会自动转发原因在这里,default=true 选择了默认方式 接着我们如果想看看底层是如何工作的就选择class属性复制双引号的内容 接着按住ctrl+shift+T就能出现一个框 OPen Type 进去之后发现是这个,点击Attach Source---->选择第二…
本文转载自无始无终,原文连接 HashMap 在 JDK 1.8 后新增的红黑树结构 传统 HashMap 的缺点 JDK 1.8 以前 HashMap 的实现是 数组+链表,即使哈希函数取得再好,也很难达到元素百分百均匀分布. 当 HashMap哈希冲突严重时,有大量的元素都存放到同一个桶中时,这个桶下有一条长长的链表,这个时候 HashMap 就相当于一个单链表,假如单链表有 n 个元素,遍历的时间复杂度就是 O(n),完全失去了它的优势. 针对这种情况,JDK 1.8 中引入了 红黑树(查…
背景 公司业务性能优化,使用java自带的Executors.newFixedThreadPool()方法生成线程池.但是其内部定义的LinkedBlockingQueue容量是Integer.MAX_VALUE.考虑到如果数据库中待处理数据量很大有可能会在短时间内往LinkedBlockingQueue中填充很多数据,导致内存溢出.于是看了一下线程池这块的源码,并在此记录. 类图 Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable),返回值为void,参数…
如无特殊说明,文中的代码均是JDK 1.8版本. 在JDK集合框架中描述过,JDK存储一组Object的集合框架是Collection.而针对Collection框架的一组操作集合体是Collections,里面包含了多种针对Collection的操作,例如:排序.查找.交换.反转.复制等. 这一节讲述Collections的排序操作. public static <T extends Comparable<? super T>> void sort(List<T> l…
Java中使用线程池技术一般都是使用Executors这个工厂类,它提供了非常简单方法来创建各种类型的线程池: public static ExecutorService newFixedThreadPool(int nThreads) public static ExecutorService newSingleThreadExecutor() public static ExecutorService newCachedThreadPool() public static Scheduled…
本文转载自joemsu,原文链接 [JDK1.8]JDK1.8集合源码阅读——TreeMap(二) TreeMap是JDK中一种排序的数据结构.在这一篇里,我们将分析TreeMap的数据结构,深入理解它的排序能力是如何实现的.这一节要有一定的数据结构基础,在阅读下面的之前,推荐大家先看一下:<算法4>深入理解红黑树.(这里介绍的红黑树实现:从2-3树到红黑树的过渡很清晰,虽然源码里的实现不是这种方式 T^T),先了解一下红黑树的由来以及它的特性,这样能更好的理解TreeMap的实现. Tree…
归并排序是JDK对象数组的排序算法之一,接下来开始分析JDK的归并排序算法. /** * 将指定范围的对象数组按自然顺序升序排序 * * Src is the source array that starts at index 0 * Dest is the (possibly larger) array destination with a possible offset * low is the index in dest to start sorting * high is the end…
我们以往使用ibatis或者mybatis 都是以这种方式调用XML当中定义的CRUD标签来执行SQL 比如这样 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"   "http://mybatis.org/dtd/mybatis-3-mapper.dtd"…
自动装箱(boxing)和自动拆箱(unboxing)   首先了解下Java的四类八种基本数据类型   基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1/8 true|false Boolean char 2 -128~127 Character byte 1 -128~127 Byte short 2 -2ˆ15~2ˆ15-1 Short int 4 -2ˆ31~2ˆ31-1 Integer long 8 -2ˆ63~2ˆ63-1 Long float 4 -3.40…
Evernote公开链接:http://www.evernote.com/shard/s133/sh/5b8d3b26-0e53-4c61-aa43-66f6e87bbcb7/a44096dd557f5eb50cde89ad1782faf2…
这篇文章是分析第一个小实例ActionTest的源码.其实所有实例程序的结构都是一样的,只有特定方法里的代码不同,大的框架都是一样的.也就是说看完这篇文章你就可以自己开始分析其他源码了. 废话不多说,咱们接着上一篇文章开始讲.上一篇文章最后我们讲到开启下个场景的代码 void TestController::menuCallback(CCObject * pSender) { // 获取被点击的子菜单项, CCMenuItem* pMenuItem = (CCMenuItem *)(pSende…
前言 在JDK1.7&1.8源码对比分析[集合]HashMap中我们遗留了一个问题:为什么HashMap在调用resize() 方法时会出现死循环?这篇文章就通过JDK1.7的源码来分析并解释这个问题. 如下,并发场景下使用HashMap造成Race Condition,从而导致死循环,现象是CPU 100%被占用. final HashMap<String, String> map = new HashMap<String, String>(); for (int i =…
本文转载自joemsu,原文连接 [JDK1.8]JDK1.8集合源码阅读——LinkedHashMap LinkedHashMap的数据结构 可以从上图中看到,LinkedHashMap数据结构相比较于HashMap来说,添加了双向指针,分别指向前一个节点——before和后一个节点——after,从而将所有的节点已链表的形式串联一起来,从名字上来看LinkedHashMap与HashMap有一定的联系,实际上也确实是这样,LinkedHashMap继承了HashMap,重写了HashMap的…
本文转载自于晓飞93,原文链接 DualPivotQuickSort 双轴快速排序 源码 笔记 DualPivotQuicksort是Arrays类中提供的给基本类型的数据排序的算法.它针对每种基本数据类型都有对应的实现,实现方式有细微差异,但思路都是相同的,所以这里只挑选int类型的排序. 整个实现中的思路是:首先检查数组的长度,比一个阈值小的时候直接使用双轴快排.其它情况下,先检查数组中数据的顺序连续性.把数组中连续升序或者连续降序的信息记录下来,顺便把连续降序的部分倒置.这样数据就被切割成…
自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型   基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1/8 true|false Boolean char 2 -128~127 Character byte 1 -128~127 Byte short 2 -2ˆ15~2ˆ15-1 Short int 4 -2ˆ31~2ˆ31-1 Integer long 8 -2ˆ63~2ˆ63-1 Long float 4 -3.403E…
1.简介 本篇文章将向大家介绍 MyBatis 内置数据源的实现逻辑.搞懂这些数据源的实现,可使大家对数据源有更深入的认识.同时在配置这些数据源时,也会更清楚每种属性的意义和用途.因此,如果大家想知其然,也知其所以然.那么接下来就让我们一起去探索 MyBatis 内置数据源的源码吧. MyBatis 支持三种数据源配置,分别为 UNPOOLED.POOLED 和 JNDI.并提供了两种数据源实现,分别是 UnpooledDataSource 和 PooledDataSource.在三种数据源配置…
javap Java反编译工具,主要用于根据Java字节码文件反汇编为Java源代码文件用法:javap 用法 描述 javap -help —help -? 输出此用法消息 javap -version 版本消息 javap -v -verbose 输出附加信息 javap -l 输出行号和本地变量表 javap -public 仅显示公共类和成员 javap -protected 显示受保护的/公共类和成员 javap -package 显示程序包/受保护的/公共类和成员 (默认) java…
使用JDK内置的观察者模式 1. 可观察者(主题) 被观察的主题继承 Observable 对象, 使用该对象的调用 notifyObservers() 或 notifyObservers(arg) 方法通知观察者 public class Subject extends Observable{ public void changeStatus(){ // ... 调用其他方法 // 关键点,调用notifyObservers() 或notifyObservers(arg)方法 notifyOb…
1.Java应用中的日志功能 ================= 一般的Java应用程序中都有记录日志的需求,目前主流的记录日志的方法是在应用程序中引入log4j,用log4j来生成日志.其实,JDK带有自己的日志系统,使用起来也很方便. 2.Java内置日志的使用方法 ================= JDK内置的日志系统相关的类都包含在java.util.logging这个包中.下面通过例子,由简到繁解释JDK内置日志系统的使用方法. 为了让应用程序有记录日志的能力,必须先在应用程序中获得…
Java自带的性能监测工具用法简介——jstack.jconsole.jinfo.jmap.jdb.jsta.jvisualvmJDK内置工具使用 一.javah命令(C Header and Stub File Generator) 二.jps命令(Java Virtual Machine Process Status Tool) 三.jstack命令(Java Stack Trace) 四.jstat命令(Java Virtual Machine Statistics Monitoring…
一.序言 本文讲述仅针对 JVM 层次的内置锁,不涉及分布式锁. 锁有多种分类形式,比如公平锁与非公平锁.可重入锁与非重入锁.独享锁与共享锁.乐观锁与悲观锁.互斥锁与读写锁.自旋锁.分段锁和偏向锁/轻量级锁/重量级锁. 下面将配合示例讲解各种锁的概念,期望能够达到如下目标:一是在生产环境中不错误的使用锁:二是在生产环境中选择恰当的锁. 对锁了解不多的情况下,应该首先保证业务的正确性,然后考虑性能,比如万金油synchronized锁或者自带多重属性的ReentrantReadWriteLock锁…
1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public final void acquireShared(int arg) { if (tryAcquireShared(arg) < 0) doAcquireShared(arg); } 与acquire()方法一样,tryAcquireShared()为自己是实现的对资源获取的接口,AQS对返回值的语义已经定…
在前面源码剖析介绍中,spark 源码分析之二 -- SparkContext 的初始化过程 中的SparkEnv和 spark 源码分析之四 -- TaskScheduler的创建和启动过程 中的ClientApp启动过程中,都涉及到了Spark的内置RPC的知识.本篇专门把RPC 拿出来剖析一下. 因为RPC 在 Spark 中内容虽然不多,但理清楚还是花费很多精力的,计划每天只剖析一小部分,等剖析完毕,会专门有一篇总结性的文章出来. 本篇作为RPC分析开篇,主要剖析了NettyRpcEnv…
@(MyBatis)[DataSource] MyBatis源码分析(5)--内置DataSource实现 MyBatis内置了两个DataSource的实现:UnpooledDataSource,该数据源对于每次获取请求都简单的打开和关闭连接.PooledDataSource,该数据源在Unpooled的基础上构建了连接池. UnpooledDataSource 配置 UNPOOLED数据源只有5个属性需要配置: driver:JDBC具体数据库驱动 url:JDBC连接 username:用…
在spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRpcEnv中,剖析了NettyRpcEnv的创建过程. Dispatcher.NettyStreamManager.TransportContext.TransportClientFactory.TransportServer.Outbox.Inbox等等基础的知识都已经在前面剖析过了. 可以参照如下文章做进一步了解. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12…
前言 Django为我们提供了内置的User模型,不需要我们再额外定义用户模型,建立用户体系了.它的完整的路径是在django.contrib.auth.models.User. User模型源码分析 class User(AbstractUser): """ Django 身份验证系统中的用户由该模型表示 需要用户名和密码.其他字段是可选的. """ class Meta(AbstractUser.Meta): swappable = 'AUT…
前言 这里普及一下,每个公司都有职别定级系统,阿里也是,技术岗以 P 定级,一般校招 P5, 社招 P6 起.其实阅读源码也是有很多诀窍的,这里分享几点心得: 首先要会用.你要知道这个库是干什么的,掌握它基本的使用方法: 有目的性.针对某个功能有目的的去挖掘,这样就不会在茫茫源码中迷失方向: 不需要看完所有细节.有的人阅读源码爱钻牛角尖,非要把每一个小细节都搞清楚,以至于看了一天可能都没看明白主干是什么. 阅读源码确实不简单,但是不要着急,从简单的源码开始,慢慢提升,学会抽丝剥茧,层层递进,逐渐…