http://blog.csdn.net/tenderhearted/article/details/39642275 http://www.cnblogs.com/iceAeterNa/p/4876940.html 1.java -verbose:class 在程序运行的时候究竟会有多少类被加载呢,一个简单程序会加载上百个类的!你可以用verbose:class来监视,在命令行输入java -verbose:class XXX  (XXX为程序名)你会在控制台看到加载的类的情况. verbos…
java 日志体系(四)log4j 源码分析 logback.log4j2.jul 都是在 log4j 的基础上扩展的,其实现的逻辑都差不多,下面以 log4j 为例剖析一下日志框架的基本组件. 一.总体架构 log4j 使用如下: @Test public void test() { Log log = LogFactory.getLog(JclTest.class); log.info("jcl log"); } log.info 时调用的时序图如下: 在 log4j 的配置文件,…
在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: 1 public class ComAddr{ 2 public static void main(String[] args) throws Exception { 3 String s1 = "nihao"; 4 String s2 = "nihao"; 5 Str…
Java的三种代理模式&完整源码分析 参考资料: 博客园-Java的三种代理模式 简书-JDK动态代理-超详细源码分析 [博客园-WeakCache缓存的实现机制](https://www.cnblogs.com/liuyun1995/p/8144676.html) 静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类 可以做到在不修改目标对象的功能前提下,对目标功能扩展 缺点: 因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,…
背景介绍 提起SPI机制,可能很多人不太熟悉,它是由JDK直接提供的,全称为:Service Provider Interface.而在平时的使用过程中也很少遇到,但如果你阅读一些框架的源码时,会发现它的有点无处不在的感觉.比如我们经常使用的spring框架,其spring-web包下就在使用该机制. 还有我们每个项目都离不开的日志框架log4j和数据库驱动框架中也同样的使用着SPI机制. 这么看来,SPI机制可谓无处不在,那么今天这篇文章就带大家揭开它的神秘面纱. 什么是SPI机制 SPI机制…
一.摘要 BlockingQueue通常用于一个线程在生产对象,而另外一个线程在消费这些对象的场景,例如在线程池中,当运行的线程数目大于核心的线程数目时候,经常就会把新来的线程对象放到BlockingQueue中去. 二.阻塞队列原理 原理简单的来讲:就是一个线程往队列里面放,而另外的一个线程从里面取 当线程持续的产生新对象并放入到队列中,直到队列达到它所能容纳的临界点.注意,队列的容量是有限的,不可能一直往里面插入对象.如果队列到达了临界点时,这个时候再想往队列中插入元素则会产生阻塞,直到另一…
以脑图的形式来展示Java集合知识,让零碎知识点形成体系 Iterator 对比   Iterator(迭代器)是一种设计模式,是一个对象,用于遍历集合中的所有元素.  Iterator 包含四个方法,分别是:next().hasNext().remove().forEachRemaining(Consumer<? super E> action)   Collection 接口继承 java.lang.Iterable,因此所有 Collection 实现类都拥有 Iterator 迭代能力…
一.前言 在分析了锁框架的其他类之后,下面进入锁框架中最后一个类ReentrantReadWriteLock的分析,它表示可重入读写锁,ReentrantReadWriteLock中包含了两种锁,读锁ReadLock和写锁WriteLock,可以通过这两种锁实现线程间的同步,下面开始进行分析. 二.ReentrantReadWriteLock数据结构 分析源码可以知道,ReentrantReadWriteLock底层是基于ReentrantLock和AbstractQueuedSynchroni…
在使用Selector时首先需要通过静态方法open创建Selector对象 public static Selector open() throws IOException { return SelectorProvider.provider().openSelector(); } 可以看到首先是调用SelectorProvider的静态方法provider,得到一个Selector的提供者 public static SelectorProvider provider() { synchro…
之前介绍了Java并发的基础知识和使用案例分析,接下来我们正式地进入Java并发的源码分析阶段,本文作为源码分析地开篇,源码参考JDK1.8 OverView: JDK1.8源码中的注释提到:ConcurrentHashMap是一种提供完整的并发检索和对于并发更新有高预测性的散列表,遵循了与HashMap相同的功能性规格,并包含与HashTable每个方法都对应的方法.虽然所有操作都是线程安全的,但检索操作并不牵涉任何锁,不支持任何锁住整个散列表来保护所有的访问. ConcurrentHashM…