自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

惟愿无事

不念过往 不畏将来

  • 博客(126)
  • 收藏
  • 关注

原创 memcached 一些知识

2 memcached stats 命令说明pid: memcached服务进程的进程IDuptime: memcached服务从启动到当前所经过的时间,单位是秒。3. t

2016-06-07 09:31:33 944

原创 Java中的线程池——3种常用的ThreadPoolExecutor

在Executor框架下,利用Executors的静态方法可以创建三种类型的常用线程池。他们可分别对应不同的应用场景,下面来看看这三个线程池。1 FixedThreadPool这个线程池可以创建固定线程数的线程池。它的构造源码如下:public static ExecutorService newFixedThreadPool(int nThreads) { r

2015-12-24 09:25:22 7462 4

原创 Java中的线程池——Executor框架

1 Executor框架简介我们通常创建的Java线程它既是工作单元,又是执行机制。每创建一个任务就需要一个新建一个线程来执行,这样会极大的消耗系统资源。从JDK5开始,把工作单元和执行分离开,工作单元变为Runable和Callable,而执行机制就是Executor框架。Executor框架的类与接口图如下2 框架的结构Executor框架主要由3大

2015-12-23 13:28:24 1691

原创 Java中的线程池——ThreadPoolExecutor的原理

1 线程池的处理流程向线程池提交一个任务后,它的主要处理流程如下图所示一个线程从被提交(submit)到执行共经历以下流程:线程池判断核心线程池里是的线程是否都在执行任务,如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下一个流程线程池判断工作队列是否已满。如果工作队列没有满,则将新提交的任务储存在这个工作队列里。如果工作队列满了,则进入下

2015-12-22 19:59:42 9182

原创 Java中的线程池——ThreadPoolExecutor的使用

开发过程中,合理地使用线程池可以带来3个好处:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。1 线程池的创建ThreadPoolExecutor有

2015-12-22 14:18:43 45216 3

原创 Java中的锁——ReentrantReadWriteLock(读写锁)

上一篇里讲的ReentrankLock是一种排他锁,即同一时间只能有一个线程进入。而读写锁在同一时刻允许多个读线程访问,但是在写线程访问时,所有的读线程和其他线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读写锁,使得并发性比一般的排它锁有了很大提升。因为大多数应用场景都是读多于写的,因此在这样的情况下,读写锁可以提高吞吐量。下图描述了关于读写锁的三个特性:公平性、重入性和锁降级。

2015-12-21 10:07:12 2966 3

原创 Java中的锁——重入锁ReentrantLock

ReentrantLock 是一种支持支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁,除此之外,该锁还支持获取锁的公平性和非公平性选择。1  重入的实现对于锁的重入,我们来想这样一个场景。当一个递归方法被sychronized关键字修饰时,在调用方法时显然没有发生问题,执行线程获取了锁之后仍能连续多次地获得该锁,也就是说sychronized关键字支持锁的重入。对于Reentr

2015-12-20 14:48:00 4011

原创 Java中的锁——队列同步器

队列同步器AbstractQueuedSynchronizer(AQS),似乎我们不经常用,但是它是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。下图显示了java.concurrent包的实现示意图同步器的主要使用方式是继承,一般作为同步器组件的静态内部类,在同步器中仅定义了与状态相关的方法,且这个状

2015-12-20 13:27:12 8120 10

原创 Synchronized与三种锁态

介绍Sychronized的锁实现原理以及三种锁态(偏向锁、轻量级锁和重量级锁)的关系

2015-12-17 20:53:38 8092

原创 集群服务器Session同步及一种基于Memcached的session同步

1 Session的集群管理事实上,网站总是有状态的。每一个登录信息、用户信息常常被存储在session内部。而当一个网站被部署在不止一台服务器的时候,就会遇到session同步的问题。事实上即使一个很小的网站,也要至少有两台服务器互为备份,分单流量是必须得,更重要的是无缝切流量升级。为了保证服务的不间断又要进行网站的维护升级,切流量是最简单的。那么如何保证切流量的时候session也会跟

2015-12-16 15:41:47 3179

原创 JVM内存静态与动态分配

1 静态内存分配与回收在Java中静态分配内存是指在Java被编译时就已经能够确定需要的内存空间,当程序被加载时系统把内存一次性分配给它。这些内存不会再程序执行时发生变化,直到程序运行结束才被回收。在Java的类和方法中的局部变量包括原生数据类型和对象的引用都是静态分配的。这些静态内存实际上是在栈上分配的。静态内存空间当代码运行结束后,对应的栈帧被撤销被回收。public void mai

2015-12-14 14:10:05 1911

原创 类加载器内存泄露与tomcat自定义加载器

类加载器如何发生内存泄露,以及Tomcat与类加载器有关的源代码,分析了Tomcat的启动流程

2015-12-14 10:59:13 4100 1

原创 类加载器

类加载器、常见异常以及如何自定义类加载器

2015-12-10 10:31:34 1666

原创 并发的单例陷阱

1  并发的单例是什么样的1.1 单机的singleton 1.0在编程的时候,我们会用到单例模式,尤其是一些工具类或数据库连接类常常是单例的。因为他们经常被使用,重复的初始化成本又比较高,因此写成单例模式的。我们都知道单例只有一个对象存在,通常会写成下面这种形式。public class SingletonCommon{ private static SingletonCom

2015-11-22 22:37:42 3002

原创 ConcurrentHashMap源码分析(JDK8版本)

注:本文源码是JDK8的版本,与之前的版本有较大差异ConcurrentHashMap是conccurrent家族中的一个类,由于它可以高效地支持并发操作,以及被广泛使用,经典的开源框架Spring的底层数据结构就是使用ConcurrentHashMap实现的。与同是线程安全的老大哥HashTable相比,它已经更胜一筹,因此它的锁更加细化.

2015-08-26 19:10:16 55512 42

原创 Spring 事务源码分析——Hibernate篇

在Spring与Hibernate整合的时候,可以利用Spring的事务管理机制,为我们管理事务的开启、提交、回滚等操作。这样的方式极大的减少了我们的代码量,让我们只专注于业务代码的编写。在使用Hibernate的时候,每一个操作都要经历事务开启与提交这样的操作,他们在业务代码的周围,这样来看是不是就想到了AOP编程,把这部分代码抽取出来。没错,Spring正是这样做的,Spring的事务管理就是

2015-08-26 18:40:20 2984 1

原创 Memcached

Memcached是一个免费开源的,高性能的,具有分布式对象的缓存系统,它可以用来保存一些经常存取的对象或数据,保存的数据像一张巨大的hash表,该表以Key-value对的方式存在内存中。它实现了客户端的分布式缓存,但没有实现服务端的分布式。所谓分布式,就是将不同的键值保存到不同的服务器上,这样就实现了memcached的分布式。Memcached服务器增多以后,键就会分散,即使一台memc

2015-08-21 20:11:47 1448

原创 Spring AOP原理

Spring利用动态代理技术实现了AOP增强功能。这个动态代理是通过Java的动态代理或CGLIB技术实现。具体根据代理对象实现的是类或者接口来决定。Spring AOP的过程跟我们平时使用动态代理的过程是很相似的,只不过它帮助我们自动组装了增强方法与代理对象,这样我们就可以更加灵活,因为我们可以选择增强触发的时机,而且更加关注我们要做的事情。从原理以及源代码的角度,整个过程还是分为两个阶段,

2015-08-21 20:01:47 3617

原创 Spring Hibernate 开启事务

仅仅记录一下配置文件<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.sp

2015-08-19 19:48:17 2698

原创 Java语法糖

语法糖,又称语法糖衣,是英国计算机科学家发明的一个术语,指在计算机语言中加入某种语法,这种语法对语言的功能并没有影响,但是方便了程序员的操作,并且增加了代码的可读性,减少了出错的机会。Java在现代编程语言中,属于“低糖语言”(相对于JVM和c#)来说,尤其在JDK1.5之前,语法糖很少出现。Java中最常用的语法糖主要是泛型、变长参数、自动装箱、拆箱等,虚拟机运行时不支持这些语法糖操作,他们

2015-08-08 11:29:36 2614

原创 volatile 关键字

本文介绍了volatile关键字 的作用、适用场景、指令重排序和实现原理

2015-08-08 11:19:39 930 1

原创 JVM垃圾收集(四) 堆上分区分配与回收

1 堆分区1.1 新生代(Young Generation)和老年代(Tenured Generation)JVM根据对象生存的特点,将对象划分为新生代和老年代。大部分对象在JVM内存中处是新生代,他们有一个特点,“朝生夕死”,即他们的生命周期很短,伴随着一次GC可能就会被回收掉。相对于新生代来说,老年代就是相对“稳定”的一些对象。他们被JVM“认为”是可以长期存活的对象。一般来说

2015-08-08 11:12:21 2381

原创 JVM垃圾收集(三)垃圾收集器

先来看看目前主流的垃圾收集器和他们的关系介绍两个术语的区别并行:多个垃圾收集线程并行工作,但此时用户线程仍处于工作状态并发:用户线程与垃圾收集器线程同时执行(可能交替执行),用于线程仍在工作,垃圾收集程序运行于另一个CPU上。1Serial收集器Serial收集器是最基本,发展历史最久的收集器,在早期的版本中,它是唯一的垃圾收集器。这是一个单线程收集器,“单线程

2015-08-08 10:02:53 554

原创 JVM垃圾收集(二)垃圾收集算法

1 标记-清除算法(Mark-Sweep)这是最基础的算法,这个算法分为两个阶段标记和清除。首先标记出所有需要清除的对象,然后统一回收标记的对象。这种算法是最简单的,后续的算法都是在它的基础上改进得到的。它存在两个问题:它的标记和清除效率都不高是空间问题,标记清除后,产生大量的不连续的内存碎片。这可能导致在以后的对象分配的过程中,需要占用空间较大的对象可能找不到合适的连

2015-08-08 09:48:22 474

原创 JVM垃圾收集(一) 寻找垃圾

1 如何判断对象为“垃圾”在垃圾回收之前,首先要判断哪些对象为“垃圾”,也就是判断哪些对象已经死去了,这里面的死去的概念就是这个对象不可能再被任何途径使用。1.1     引用计数器法一个很简单、效率也很高的方法。给对象添加一个引用计数器,每当有一个地方引用它时,计数器+1;当引用失效时,计数器-1;任何时刻计算器值为0的对象即为不再被使用的对象。但是Java虚拟机没有使用这种

2015-08-08 09:39:18 908

原创 Java内存模型

内存模型可以理解为在特定的操作协议下,对特别的内存或高速缓存进行读写访问的过程抽象。不同架构的物理机器可以拥有不一样的内存模型,而Java虚拟机也有自己的内存模型。Java虚拟机规范中试图定义一种内存模型,来屏蔽掉各种硬件和操作系统的差异,以实现让让Java程序在各种平台下达到一致的访问效果。1 主内存与工作内存Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变

2015-08-08 09:26:21 529

原创 4 IoC容器的依赖注入(2)

相对于Bean的创建过程,注入过程显得简单而清晰的多。注入的过程整体分为两个阶段:第一个阶段是依据BeanDefition定义的property找到相关的属性值,这个过程中如果定义了autowireByName 或者autowireByType  优先进行这两个定义的查找,然后进行正常匹配,也就是我们定义的,这个部分会覆盖掉autowire的内容。以上所有找到的属性值都会放到一个deepc

2015-08-08 09:15:56 865

原创 JVM 如何创建Java对象

在Java程序中,创建一个对象通常需要一个new关键字就够了,但是在虚拟机中,这个过程却有点复杂,这里面包括了类加载、内存分配、初始化零值等等一系列的步骤。下面来看看JVM如何创建一个对象(这里面的对象仅仅限于不同的Java对象,不包括数组和Class对象)1 对象的创建1.1 类初始化当JVM遇到一条new的指令(与new关键字不是一个概念)时,首先去检查这个指令是否在常量池

2015-08-04 20:38:02 2044

原创 Spring的自动装配

1Spring自动装配的分类Spring能自动装配Bean与Bean之间的依赖关系,即无须使用ref显式地指定依赖Bean,而是由Spring容器检查XML配置文件内容。根据某种规则,为调用者Bean注入被依赖的Bean。Spring的自动装配可以通过元素的default-autowire属性指定,该属性对配置文件中所有的Bean起作用;也可以通过元素的autowire属性指定,该属性

2015-08-02 11:29:46 3102

原创 Spring 循环引用 ——理解singleton与prototype初始化的区别

spring的循环引用解决机制 以及singleton与prototype能否实现循环引用的原因。

2015-08-02 09:36:40 11442

原创 3 IoC容器的依赖注入(1)

在applicationContext加载的时候,已经将BeanDefition保存在一个concurrentHashMap中,然而这些并不是真正的bean,真正的bean其实还没有初始化以及依赖注入。对于整个依赖注入的过程,大致可以分为两个阶段,第一阶段是Bean的初始化,如何采用设值注入的方式,那么这个阶段就是利用默认构造器去构造一个空对象,等待着注入;如果是构造注入,那么这个过程可能就会

2015-08-01 10:43:34 1950

原创 F 序列化

Java 对象只有在虚拟机运行的情况下才存在,而虚拟机关闭了以后,这个对象也随着内存回收被释放掉,这种状态称为“瞬态”。如何把这种瞬态转换为持久态就是序列化要解决的问题。除了持久化需要用到序列化以外,把一个对象在网络上进行传输也是序列化的一个重要功能。在网络上,数据以字节的形式进行传输,序列化可以把一个对象作为整体在网络上传输,在网络的另一端,对这个整体进行还原。这样就实现了以对象为单位的传输。

2015-08-01 09:07:30 541

原创 E 接口

1 接口的注意事项接口主要用来描述类具有什么功能,而并不给出每个功能具体实现。一个类可以实现多个接口。接口中所有的方法自动属于public,在声明接口的时候不必提供关键字public。接口中的方法仅能由 public, abstract, default, static 来修饰。在实现接口时,必须把方法声明为public;否则,编译器将认为这个方法属于包可见性,即默认的访问属性,编译器

2015-07-29 19:44:41 750

原创 JVM 运行时数据区

JVM在执行Jva程序时候会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间。下图表示运行时数据区的基本划分,图片来自其他微博。1 程序计数器程序计数器是一块比较的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机概念模型里,通过改变这个计数器的值还选取下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程恢复等基础功能都需要

2015-07-27 08:04:21 532

原创 2 IOC容器初始化过程

IOC容器的初始化分为三个过程实现:第一个过程是Resource资源定位。这个Resouce指的是BeanDefinition的资源定位。这个过程就是容器找数据的过程,就像水桶装水需要先找到水一样。第二个过程是BeanDefinition的载入过程。这个载入过程是把用户定义好的Bean表示成Ioc容器内部的数据结构,而这个容器内部的数据结构就是BeanDefition。第三

2015-07-25 21:00:36 8729 2

原创 D对象包装器与自动装箱 基本数据类型的equals与==

所有的基本类型都有一个与之对应的类,通常,这些类称为包装器。这些包装器的对象拥有很鲜明的名字:IntegerLong Float Double Short Byte Character Void 和Boolean。这里除了八种基本数据类型意外,还有一个Void类,查看它的源码,其实很简单。文档描述这个类时,也说明他仅仅是为了配合反射的一个类。public finalclass Void

2015-07-23 19:57:23 491

原创 Integer 缓存策略

在很多情况下,容易有一种假象,即基本类型与他们的对象包装器是一样的,只是他们的相等性不同。当使用==比较对象时,只不过检测他们是否指向同一个储存区域。因此,下面的比较通常不会成立:Integer a=1000;Integer b=1000;return a==b;然而,在Java中,它们可能是成立的。因为Java中,对于一些数据类型的“常用数值”采用了缓存策略。下面来看看Int

2015-07-23 08:06:17 925 3

原创 C Objcet类

Object类是Java所有类的始祖,在Java中每个类都是由它扩展而来。如果一个类没有指出它的超类,Object就被认为是这个类的超类。JDK文档中这样描述Object类Class Object is the root of the class hierarchy. Every class hasObject as a superclass. All objects, includi

2015-07-23 06:54:35 670

原创 B 类 对象 继承 多态与动态绑定

1 .java文件与.class文件Java中所有的方法,属性都必须以类的形式存在。也就是说,他们必须是类的成员。以Employee类为例,java的源文件名称为Employee.java,在这个源文件中,只能有一个public类,且它的名字为Employee。在一个Java源文件中,只能有一个公有类,但可以有任意数目的非公有类。在编译以后,每一个类将被编译成一个.class文件。

2015-07-20 20:34:56 505

原创 1 IOC容器设计与实现

在Spring IOC容器的设计中,可以看到两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本功能;另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在。应用上下文在简单容器的基础上,增加了许多面向框架的特性,同时对应用环境做了许多适配。1 BeanFactory1.1 BeanFactory的应用场

2015-07-19 08:55:00 1041

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除