- 博客(204)
- 资源 (42)
- 收藏
- 关注
原创 《Java并发编程实践》笔记8——Fork/Join框架
《java并发编程实践》书中并没有介绍Fork/Join框架,该框架和并发编程关系密切,也是由本书作者之一Doug Lea在JDK1.7引入,因此作为最后一篇笔记简单介绍。 Fork/Join框架是JDK1.7提供的一个用于并行执行任务的框架,它把一个大任务分割为若干个小任务执行,最后将小任务的执行结果汇总得到大任务的结果。当看到这个定义时,我想很多人会和我一样立刻想到现在非常热门的Map-Red
2015-07-02 10:57:43 7028
原创 《Java并发编程实践》笔记8——Fork/Join框架
《java并发编程实践》书中并没有介绍Fork/Join框架,该框架和并发编程关系密切,也是由本书作者之一Doug Lea在JDK1.7引入,因此作为最后一篇笔记简单介绍。 Fork/Join框架是JDK1.7提供的一个用于并行执行任务的框架,它把一个大任务分割为若干个小任务执行,最后将小任务的执行结果汇总得到大任务的结果。当看到这个定义时,我想很多人会和我一样立刻想到现在非常热门的Map-Red
2015-07-02 10:56:30 2714
原创 《Java并发编程实践》笔记8——Fork/Join框架
《java并发编程实践》书中并没有介绍Fork/Join框架,该框架和并发编程关系密切,也是由本书作者之一Doug Lea在JDK1.7引入,因此作为最后一篇笔记简单介绍。 Fork/Join框架是JDK1.7提供的一个用于并行执行任务的框架,它把一个大任务分割为若干个小任务执行,最后将小任务的执行结果汇总得到大任务的结果。当看到这个定义时,我想很多人会和我一样立刻想到现在非常热门的Map-Red
2015-07-02 10:54:07 2457
原创 《Java并发编程实践》笔记7——非阻塞同步算法
1.锁的劣势: 锁是实现线程同步最简单的方式,也是代价最高的方式,其有如下的缺点: (1).重量级: 现代JVM对非竞争的锁的获取和释放进行优化,可以根据系统中锁占用的历史数据决定使用自旋还是挂起等待,使得它非常高效。但是如果有多个线程同时请求锁,JVM就需要向操作系统寻求帮助,没有获取到锁的线程可能会被挂起等待,并稍后恢复运行。线程的挂起和恢复会带来很大的上下文切换和调度延时开销。 (2)
2015-07-02 10:29:35 3777
原创 《Java并发编程实践》笔记7——非阻塞同步算法
1.锁的劣势: 锁是实现线程同步最简单的方式,也是代价最高的方式,其有如下的缺点: (1).重量级: 现代JVM对非竞争的锁的获取和释放进行优化,可以根据系统中锁占用的历史数据决定使用自旋还是挂起等待,使得它非常高效。但是如果有多个线程同时请求锁,JVM就需要向操作系统寻求帮助,没有获取到锁的线程可能会被挂起等待,并稍后恢复运行。线程的挂起和恢复会带来很大的上下文切换和调度延时开销。 (2)
2015-07-02 10:28:13 2512 1
原创 《Java并发编程实践》笔记6——并发性调优
1.Amdahl定律: Amdahl(阿姆达尔)定律描述了在一个系统中,基于可并行化和串行化的组件各自所占的比重,程序通过获得额外的计算资源,理论上能够加速多少。若F是必须串行化执行的比重,那么在一个N处理器的机器中,通过Amdahl定律计算可以获得理论加速为: Speedup<=1/(F+(1-F)/N) 当N无限增大趋近与无穷大时,Speedup的最大值无限接近于1/F。 Amdahl估
2015-07-01 14:52:26 4503
原创 《Java并发编程实践》笔记5——线程活跃性问题及其解决方法
1.死锁的定义及发生条件:死锁就像是两个人过独木桥,在桥中间碰到了,谁也不想让步,结果谁也无法通过。线程A占有锁L时想要获得锁M,而线程B占有锁M并尝试获得锁L,两个线程将永远等待下去,这种情况称为死锁(deadlock),或致命拥抱(the deadly embrace)。在并发程序设计中,死锁 (deadlock) 是一种十分常见的逻辑错误。通过采用正确的编程方式,死锁的发生不难避
2015-06-26 16:41:33 5033
原创 《Java并发编程实践》笔记4——线程池高级
1.估算线程池最优大小:Ncpu = CPU的数量 = Runtime.getRuntime().availableProcessors();Ucpu = 目标CPU的使用率, 0 W/C = 等待时间与计算时间的比率;为了保持处理器达到期望的使用率,最优的线程池大小等于:Nthreads = Ncpu * Ucpu * (1+ W/C);2.配置ThreadPoolExe
2015-06-26 11:02:32 3919
原创 《Java并发编程实践》笔记3——线程池基础
1.JDK中的Executor框架是基于生产者-消费者模式的线程池,提交任务的线程是生产者,执行任务的线程是消费者。Executor线程池可以用于异步任务执行,而且支持很多不同类型任务执行策略,同时为任务提交和任务执行之间的解耦提供了标准方法。Executor线程池支持如下三种线程执行策略:(1).顺序执行:类似于单线程顺序执行任务,优点是实现简单;缺点是扩展性受限,执行效率低下,
2015-06-25 10:36:39 3252
原创 《Java并发编程实践》笔记2——基础同步类
1.同步容器类复合操作容易出现的问题:JDK中同步容器类包括两部分:早期JDK中的Vector和Hashtable;JDK1.2引入的同步包装类,即由Collections.synchronizedXxx工厂方法创建的容器类。同步容器类都是线程安全的,它们提供的基本操作都是原子操作,但是对于诸如迭代、导航和缺少即加入的条件运算等复合操作来说,通常需要使用额外的客户端加锁进行保护来确
2015-06-23 17:52:49 3084
原创 《Java并发编程实践》笔记1——并发编程基础
1.线程安全定义:当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及在调用方代码不必做其他的协调,这个类的行为仍然是正确的,那么这个类就被称之为是线程安全的。简言之对于线程安全类的实例进行顺序或并发的一系列操作,都不会导致实例处于无效状态。只有对象状态可变,且存在对象共享,才需要考虑线程安全。可以通过下面的方法来确保线程安全:(1).
2015-06-23 15:13:13 5373
原创 《Java Performance》笔记4——JVM性能调优入门
1.应用程序的系统需求:应用程序的系统需求是应用程序运行时某方面的要求,譬如吞吐量、响应时间、内存消耗量、可用性、可管理性等。JVM性能调优主要针对如下的系统需求:(1).可用性:是对应用程序处于可操作、可使用状态的度量。可用性需求指的是当程序的某些组件发生故障或失效时,应用程序或应用程序的一部分在多大程度上海可以继续提供服务。Java应用程序的上下文中,利用应用程序组件化、在多个
2015-05-21 20:32:06 4480 1
原创 《Java Performance》笔记3——Java应用性能分析工具
1.Java应用性能分析的方法分析和内存分析:方法分析:能够提供java应用程序中方法执行时间的信息,既包括java方法也包括本地方法。内存分析:提供java应用程序内存使用信息,包括内存中已分配对象的数目、大小及活跃对象等信息,并附有对象分配时的栈追踪信息。Oracle Solaris Studio Performance Analyzer是Solaris和Linux平台上常用的性能
2015-05-21 20:29:21 5901
原创 《Java Performance》笔记2——JVM命令行选项及垃圾收集日志解析
1.JVM命令行选项:HotSpot VM运行时系统解析命令行选项,并据此配置HotSpot VM,HotSpot的命令行选项主要有3类:A. 标准选项:JVM规范要求所有的JVM都必须实现的选项,它们在发行版之间保持稳定,但也可能在后续的发行版中被废除。如:-client,-server等等。B. 非标准选项:以”-X”为前缀,不保证、也不强制所有JVM实现都必须支持,它
2015-05-21 20:24:34 3018
原创 《Java Performance》笔记1——性能分析基础
1.性能分析两种方法:(1).自顶向下:应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会。(2).自底向上:性能专家从软件栈底层的CPU统计数据(例如CPU高速缓存未命中率、CPU指令效率)开始,逐渐上升到应用自身的结构或应用常见的使用方式。2.CPU使用率:大多数操作系统的CPU使用率分为用户态CPU使用率和系统态CPU使用率。用户态CPU使用率:执
2015-05-21 20:16:12 4203
原创 《java解惑》读书笔记8——更多类谜题
1.变量隐藏:问题:猜猜下面的小程序打印结果应该是什么:class Base{ public String className = "Base";}class Derived extends Base{ private String className = "Derived";}public class Test{ public stati
2014-03-04 17:13:33 3256
原创 《java解惑》读书笔记7——库谜题
1.不可变类:问题:下面的程序计算5000+50000+500000值,代码如下:import java.math.BigInteger;public class Test{ public static void main(String[] args){ BigInteger fiveThousand = new BigInteger("5000");
2014-02-24 16:06:10 3114
原创 《java解惑》读书笔记6——类谜题
1.方法重载:问题:下面的程序演示方法重载,代码如下:public class Test{ public static void main(String[] args) { new Test(null); } private Test(Object o){ System.out.println("Object");
2014-02-19 13:56:28 3286
原创 《java解惑》读书笔记5——异常谜题
1.finally语句块中的return:问题:下面的小程序运行结果是什么:public class Test { public static void main(String[] args) { System.out.println(decision()); } static boolean decision(){ t
2014-01-24 15:56:17 3215
原创 《java解惑》读书笔记4——循环谜题
1.byte数值比较:问题:下面的程序循环遍历byte数值,以查找某个特定值,代码如下:public class Test { public static void main(String[] args) { for(byte b = Byte.MIN_VALUE; b < Byte.MAX_VALUE; b++){ if(b == 0x
2014-01-17 17:21:37 3379
原创 使用JMockit编写java单元测试
之前《有效使用Mock编写java单元测试》一文中层介绍过使用EasyMock和PowerMock来编写java单元测试,今天介绍一个更加强大的工具——JMockit。引用单元测试中mock的使用及mock神器jmockit实践中的java单元测试中各种Mock框架对比,就能明白JMockit有多么强大:JMockit是基于JavaSE5中的java.lang.instrument
2014-01-04 10:55:07 39963 6
原创 《java解惑》读书笔记3——更多字符串之谜
1.字符串替换:问题:下面这段程序把类全路经名中的"."替换为"/",代码如下:package com.javapuzzlers;public class Test { public static void main(String[] args){ System.out.println(Test.class.getName().replaceAll(".", "/") +
2013-12-29 10:21:57 2212
原创 《java解惑》读书笔记2——字符串之谜
1.字符拼接:问题:程序员几乎在每天编程中都遇到和处理字符串拼接的问题,但是是否对其了解的足够深入,且看下面的程序:public static void main(String[] args) { System.out.print("H" + "a"); System.out.print('H' + 'a'); }很多人觉得输出结果应是:HaHa,但是真实的程序运行结果是:H
2013-12-02 13:45:49 2822
原创 《java解惑》读书笔记1——表达式之谜
1.奇偶性判断:问题:如果使用下面的程序判断整数奇偶性会有什么问题:public static boolean isOdd(int i){ return i % 2 == 1;}上述代码对于正整数没有任何问题,但是对于所有负奇数的判断全部都是错误的。原因:java对于取余运算符(%)的定义为:对于所有int数值a和所有非零int数值b,都满足如下恒等式:(
2013-11-21 17:02:11 2857
原创 有效使用Mock编写java单元测试
Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码进行重构。然而单元测试的编写也不是一件容易的事情,除非使用TDD方式,否则编写出容易测试的代码不但对开发人员的设计编码要求很高,而且代码中的各种依赖也常常为单元测试带来无穷无尽的障碍。令人欣慰的是开源社区各种优秀的Mock框架让单元测试不再复杂,本文简单介绍EasyMoc
2013-11-08 16:04:28 99737 5
原创 java多线程模拟M/M/C(马科洛夫队列)
M/M/C(马科洛夫队列)是一个多服务器的排队模型,在商场,银行等服务行业应用广泛,每个客户到来的时候选择等待队列最短的服务窗口排队等待服务,模型如下:使用服从指数分布的随机数(平均值为lamda)模拟每个客户到达间隔时间,使用服从正态分布的随机数(平均数为mu,标准差为sigma)模拟每个客户在服务窗口接受服务时间,给定服务窗口数,最大客户数,以及lamda,mu和sigma之后,程
2013-10-09 15:22:10 3602
原创 使用Lock,wait/notify,Semaphore三种方式实现多线程通信
java的多线程通信有Lock,wait/notify,Semaphore三种方式,已一道常见面试题来简单演示这三种多线程通信方式。两个线程循环间隔打印指定内容,一个打印从1到52的数字,一个打印从A到Z的字母,打印输出如下:12A34......5152Z使用Lock实现代码如下:import java.util.concurrent.
2013-10-08 14:56:52 10309
原创 使用PULL方式解析XML
在Java开发中大家常用SAX或者DOM解析XML文件,两者的特点也很明显:SAX基于事件驱动,速度快,占用内存少;DOM一次性把文件读入内存中,以树的方式操作XML数据更灵活。PULL是第三种优秀的XML解析方式,其工作原理和SAX类似,也是基于事件驱动的,SAX和PULL比较如下:(1)相同点:SAX/PULL都是基于事件的解析器。解析速度快,占用内存少
2013-09-09 17:19:30 1957
原创 《Effective java》读书笔记10——序列化
对象序列化是一个提供将对象编码成字节流,并从字节流编码中重新构建对象的框架,包括以下两个过程:序列化:将对象编码成字节流。反序列化:从字节流编码中重新构建对象。一旦对象被序列化后,对象的字节流编码就可以从一台正在运行的java虚拟机被传递到另一台java虚拟机上,或者被存储到硬盘上,以便以后发序列化时使用。序列化技术为远程通信提供了标准的线路级对象表示法,也为JavaBean提供了标准
2013-01-30 15:36:57 3139
原创 《Effective java》读书笔记9——线程并发
synchronized同步关键字:synchronized同步关键字可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块。线程同步不仅可以阻止一个线程看到对象处于不一致的状态之中,还可以保证进入同步方法或者同步代码块的每个线程都看到由同一个锁保护的之前所有的修改效果。Java语言规范保证读或者写一个变量是原子性操作(虽然long和double的读写操作没有被规定为原子
2013-01-22 14:34:26 3544 4
原创 《Effective java》读书笔记8——线程安全级别和延迟初始化
Java中线程安全级别:1.不可变的(immutable):不可变的类的实例是不能被修改的,每个实例中包含的所有信息都必须在创建该实例的时候就提供,并在对象的整个生命周期内固定不变。不可变类不需要外部的同步,常见例子有String,long和BigInteger。为了使类成为不可变,需要遵循下面五条规则:(1).不提供任何会修改对象状态的方法(如setter方法等)。(2)
2013-01-18 13:12:22 3069
原创 《Effective java》读书笔记7——异常
Java中异常的类体系结构如下:Throwable类是java语言中所有错误和异常的超类,它拥有两个子类:(1).Error:用于指示合理的应用程序不应该试图捕获的严重问题,例如java虚拟的错误程序无法处理,只能由java虚拟机自己处理。(2).Exception:用于指示合理的应用程序应该捕获的条件。Exception又分为:(1).Checked Except
2013-01-11 17:37:01 4000 2
原创 《Effective java》读书笔记6——方法重载
很多人分不清java的方法重载(Overload)和方法覆盖(Override),方法重载是方法名相同,而方法的参数不同(参数个数或者类型,注意不能通过参数名称和方法返回值来进行方法重载),编译器在编译的时候就已经确定了合适的目标方法,也称为早绑定或者静态分派;方法覆盖是子类拥有和父类相同签名的方法(包括参数和返回值),方法覆盖在编译时无法确定要调用的目标方法,只有在运行时由对象本事来确定合适的调
2013-01-06 13:30:27 2258 1
原创 《Effective java》读书笔记5——枚举
Java的枚举比C++/C#更加强大,它本身就是一个线程安全的单态模式,java的枚举可以添加字段和方法,也可以添加main方法。(1).枚举对象相同的行为方法:计算九大行星表面物体重量的枚举代码:public enum Planet{MERCURY(3.302e+23, 2.439e6),VENUS(4.869e+24, 6.052e6),EARTH(5.975e+24,
2013-01-04 17:18:32 2189
原创 《Effective java》读书笔记4——泛型
数组与泛型集合的区别:(1).数组是协变的,即如果Sub为Super的子类型,那么数组类型Sub[]就是Super[]的子类型;泛型是不可变的,即对于任何两个不同类型Type1和Type2,List既不是List的子类型,也不是List的超类型。Object[] objectArray = new Long[1];objectArray[0] = “I don't fit in”;
2012-12-31 15:13:36 3536
原创 《Effective java》读书笔记3——覆盖equals方法的通用约定
满足下列四个条件之一的就不需要覆盖equals方法:(1).类的每个实例本质上都是唯一的,如枚举等。(2).不关心类是否提供了“逻辑相等”的测试功能。(3).超类已经覆盖了equals方法,从超类集成过来的行为对于子类也是合适的。(4).类是私有的或者包访问权限的,可以确定它的equals方法永远不会被调用。当类具有自己特有的“逻辑相等”概念(不同于对象等同的概念),而且超类还
2012-12-25 13:52:08 3123
转载 十句励志电影台词
1."There is no certainty,only opportunity."V for Vendetta(2005)没有一定会怎样,只有可能会怎样。——《V字仇杀队》,V(雨果·威明)2."A good plan today is better than a perfect plan tomorrow."Wag the Dog(1997)-Conrad Brean(Rober
2012-09-19 09:24:20 3475 3
原创 《Expert one-on-one J2EE design and development》学习笔记1——JavaEE常用架构设计
JavaEE开发中程序架构设计不仅会影响程序性能、复杂性,同时还影响到程序的可扩展性和可维护性,目前业界有规范的JavaEE架构设计被奉为经典,下面将按照是否分布式进行介绍。非分布式架构:1.Web应用搭配业务组件接口架构:经典三层架构:用户接口层、业务逻辑层和持久化层。优点:(1).架构简单,是最常用最简单的Web应用架构,但是如果涉及到事务或者多线程问题时,需要
2012-09-17 16:46:35 7066
原创 《深入理解java虚拟机》学习笔记10——并发编程(二)
Java的并发编程是依赖虚拟机内存模型的三个特性实现的:(1).原子性(Atomicity):原子性是指不可再分的最小操作指令,即单条机器指令,原子性操作任意时刻只能有一个线程,因此是线程安全的。Java内存模型中通过read、load、assign、use、store和write这6个操作保证变量的原子性操作。long和double这两个64位长度的数据类型java虚拟机并没有强
2012-09-15 17:15:18 3111
原创 《深入理解java虚拟机》学习笔记9——并发编程(一)
随着多核CPU的高速发展,为了充分利用硬件的计算资源,操作系统的并发多任务功能正变得越来越重要,但是CPU在进行计算时,还需要从内存读取输出,并将计算结果存放到内存中,然而由于CPU的运算速度比内存高几个数量级,CPU内的寄存器数量和容量有限,为了不让CPU长时间处于等待内存的空闲状态,在CPU和内存之间引入了速度接近CPU的高速缓存Cache作为CPU和内存之间的缓冲。计算机硬件并发的原理如下:
2012-09-15 15:11:30 4303
XFire与Spring框架集成,实现WebService
2011-03-04
基于Annotation写的简单数据校验框架
2010-08-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人