Java
Ydoing
这个作者很懒,什么都没留下…
展开
-
ThreadPoolExecutor源码剖析的一些思考和总结
最近迁移一个项目,涉及到线程池的问题。特意看了一下ThreadPoolExecutor源码,记录一下。思考几个问题ThreadPoolExecutor的基本实现思路是什么? - 在线程池正在运行(running)的状态下,提交任务到线程池以后,如果线程数量小于corePoolSiez,则创建新的工作线程加入workers中,并启动该线程;如果大于等于corePoolSiez,则加入任务队列中,等待原创 2017-06-05 17:54:33 · 991 阅读 · 0 评论 -
Spring入门实例
Spring最核心的概念就是“依赖注入”。所谓依赖注入就是你需要什么对象,Spring容器就帮你实例化这个对象,然后注入到你的应用程序中。这样你就不用自己实例化依赖对象,不但简化了开发,还解耦了各模块的依赖。下面我来展示一个实例,比如Person对象要使用Computer,必须依赖Computer这个对象。使用Spring,使你不用自己new对象,Spring容器会帮你在需要的时候注入Compute原创 2015-07-19 09:41:59 · 891 阅读 · 0 评论 -
Jython入门学习
Jython是Python和Java的结合。Jython语法和Python一样,不但可以使用Python的库,而且还可以调用Java的库。结合了Python和Java的优点,也就是说Jython既有动态语言的灵活性,又可以用静态语言的强大的类库。其实,我理解 Jython 说简单一些,就是用 Java 语言实现的 Python 解释器,这种关系也就意味着你可以用 Python 语言编写程序而同时使用原创 2015-07-28 16:19:22 · 6424 阅读 · 0 评论 -
Hibernate入门与实例
Hibernate是一种ORM(对象关系/关系数据库)框架,其简单概念就是将Java中的对象映射为关系数据库中的表。程序员只需要操作Java中的对象,即只关心业务逻辑操作,Hibernate就会自动将业务逻辑操作翻译为底层SQL语句进行处理,程序员无需关系数据库中的操作。首先建立POJO对象,这个对象将映射数据库中的表Employee:package com.ydoing.domain;publi原创 2015-07-26 09:19:08 · 945 阅读 · 0 评论 -
JSP中EL表达式入门与简介
简介EL 全名为 Language ,JSP2.0 之后,EL 成为了标准规范。因此,只要是支持Servlet2.4/JSP2.0 的容器,就都可以在JSP 网页中直接使用EL 。EL主要是为了简化JSP编写。内置隐含对象param,header,sessionScope等。有”.”和”[]”两种运算存取数据。{param.name} 相当于<%=request.getParameter("name原创 2015-07-12 17:50:22 · 886 阅读 · 0 评论 -
JavaBean入门与简介
简介JavaBean是可重复使用的组件,在web发展初期(web model1),jsp用JavaBean来处理业务逻辑。 有4种生命周期: - session - request - application - pageJavaBean有几种 特点: - 公共的类 - 有不带参的构造方法 - 每个属性都有set和get方法 - 如果需要,能被持久化实例javabean:packa原创 2015-07-12 13:20:46 · 1267 阅读 · 0 评论 -
JSP语法简介
JSP指令<%@ 指令名 属性=”值”>page指令<%@ page contentType="text/html; charset=GB2312" %> include指令<%@ include file="banner.jsp" %> JSP声明声明JSP对应Servlet类的成员变量<%!private int var = 0;private String str;%>Java程序<原创 2015-06-30 21:25:59 · 842 阅读 · 0 评论 -
第一个JSP程序(JSP入门)
在web根目录新建index.jsp文件<%@ page language="java" contentType="text/html; charset=GBK"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head>原创 2015-06-30 20:57:00 · 1456 阅读 · 0 评论 -
Java注解Annotation简介
注解定义和使用注解定义为:public @interface AnnotationName{}使用注解@ AnnotationNamepublic void func(){}Java提供了4个元注解@Retention:保留的阶段。 @Target:注解修饰的目标,可以说类,方法,成员变量,包。 @Documented:是否被javadoc提取成文的。 @Inherited:注解是否能继原创 2015-06-28 22:03:01 · 608 阅读 · 0 评论 -
Hiberate基础用法实例
下面通过一个实际的列子来展示Hibernate的基本用法。实例:package com.ydoing.domain;import java.util.ArrayList;import java.util.Date;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.原创 2015-08-02 17:34:12 · 1388 阅读 · 0 评论 -
Java虚拟机类加载机制
类加载的整个生命周期:加载、验证、准备、解析、初始化、使用、卸载。其中验证、准备、解析3个部分统称为连接。初始化情况遇到new、getstatic、putstatic、invokestatic这4条字节码指令。使用java.lang.reflect包的方法对类进行反射调用。初始化的一个类的时候,发现其父类没有进行初始化。初始化化主类(包含main()方法的那个类) 这几种情况称为主动引用。原创 2015-03-23 21:15:54 · 600 阅读 · 0 评论 -
Java多线程并发编程之构建自定义同步工具
当Java类库没有提供适合的同步工具时,就需要构建自定义同步工具。可阻塞状态依赖操作的结构acquir lock on object state;//请求获取锁while(precondition does not hold){//没有满足前提条件 release lock;//先释放锁 wait until precondition might原创 2015-03-01 14:12:21 · 593 阅读 · 0 评论 -
AOP的实现的几种方式
静态AOP 在编译期,切面直接以字节 码的形式编译到目标字节 码文件中。AspectJ属于静态AOP,是在编译时进行增强,会在编译的时候将AOP逻辑织入到代码中,需要专有的编译器和织入器。优点:被织入的类性能不受影响。缺点:不够灵活动态AOPJDK动态代理 在运行期,目标类加载后,为接口动态生成代理类,将切面植入到代理类中。Java从1.3引入动态代理。实现原理是为被代理的业务接口原创 2016-12-04 16:57:33 · 13880 阅读 · 0 评论 -
关于ThreadLocal内存泄漏引起的思考
概述最近在对一个项目进行重构,用到了ThreadLocal。场景如下:外围系统会调用接口上传数据,在接口中要记录数据的变化Id,在上传数据完后需要集中在一个地方把这些Id以消息形式发送出去。使用场景样例代码 public Result<Void> uploadOrder(TotalPayInfoVo totalPayInfoVo) { try { sav原创 2016-11-01 19:59:17 · 3726 阅读 · 0 评论 -
Java线程安全详细总结
以下是我的PPT文档,不知道怎么复制到博客,只能一个一个插入图片发上来了。感觉总结的不错,分享一下。原创 2016-05-20 22:13:02 · 615 阅读 · 0 评论 -
Guava中并发ListenableFuture使用
最近在项目中要优化接口,发现guava并发编程中的ListenableFuture比较适合,所以就用上了。感觉还不错,分享一下。使用场景是这样的,客户端需要上传数据到服务端,涉及到几个表的插入。之前都是一个一个表插入的,性能不是很好的。现在改为并发插入,代码如下:private ListeningExecutorService executorService = MoreExecutors.list原创 2016-05-19 14:28:10 · 6202 阅读 · 2 评论 -
Java线程安全策略
不可变final事实不可变如String无状态没有实例域如Servletvolatile运算结果不依赖当前变量值不参与不变性约束如AQS的state线程封闭线程栈内私有,方法中局部变量的使用ThreadLocal,相当月MapJ.U.C工具包以Concurrent前缀的并发类,如ConcurrentHashMap含有Blocking的阻塞类,如LinkedBlockin原创 2016-04-23 16:51:32 · 983 阅读 · 0 评论 -
Java并发编程学习路线图
思维导图如下:原创 2016-05-18 10:08:31 · 2612 阅读 · 1 评论 -
FastJSON自定义序列化-修改属性值
简介SerializeFilter是通过编程扩展的方式定制序列化。fastjson支持6种SerializeFilter,用于不同场景的定制序列化。PropertyPreFilter 根据PropertyName判断是否序列化 PropertyFilter 根据PropertyName和PropertyValue来判断是否序列化 NameFilter 修改Key,如果需要修改Key,proces原创 2016-02-24 18:52:33 · 17598 阅读 · 0 评论 -
Java并发编程之闭锁CountDownLatch简介
闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有任何线程可以通过,当到达结束状态时,这扇门才会打开并容许所有线程通过。它可以使一个或多个线程等待一组事件发生。闭锁状态包括一个计数器,初始化为一个正式,正数表示需要等待的事件数量。countDown方法递减计数器,表示一个事件已经发生,而await方法等待计数器到达0,表示等待的事件已经发生。CountDownLatch强调的是一原创 2015-03-13 07:54:33 · 1308 阅读 · 0 评论 -
Java反射机制
概述JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是原创 2015-03-25 22:10:21 · 798 阅读 · 0 评论 -
Servlet入门(第一个Servlet的Web程序)
新建maven项目,注意项目的类型 工程名为ServletExample 点击Finish,建立maven项目完成如下 生成后的目录没有java源码目录,按照maven的约定,还要新建src/main/java的源码目录。选中项目,点击鼠标右键 不知道为什么,新建src/main/java目录时,eclipse报这个目录原创 2015-06-28 20:26:16 · 824 阅读 · 1 评论 -
设计模式-装饰器模式(Decorator)
1.意图动态地给一个对象添加一些额外的功能.2.适用性 动态、透明的方式给单个对象添加职责。 如果不适合适用子类来进行扩展的时候,可以考虑适用装饰模式。 避免子类数目爆炸性增长。 3.结构4.模式应用Java中的I/O流面向切面编程AOP(思想相似)5.实例1)场景一个软件公司由员工Employee组成,员工又分为开发人员Dev、领导Leader、经理Manager、Q原创 2015-03-02 21:57:10 · 502 阅读 · 0 评论 -
Java配置环境变量
Ubuntu配置vi /etc/profile,加入如下内容:export JAVA_HOME=/usr/java/jdk1.7.0_65#export JRE_HOME=${JAVA_HOME}/jre#export CLASSPATH=.:$JAVA_HOME:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jare原创 2015-06-23 11:11:36 · 685 阅读 · 0 评论 -
Java多线程并发编程之变量
编写线程安全需要关心的:共享的变量可变的变量共享意味着多个线程可以同时访问,可变意味着其值在生命周期可以改变。例如以下count 变量://线程不安全的类public class UnsafeCount { private int count = 0; //该变量是共享的 public void increase() {原创 2015-03-12 09:49:48 · 1325 阅读 · 0 评论 -
Java并发编程实践(读书笔记) 任务执行(未完)
任务的定义大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元. 任务的执行策略 1.顺序的执行任务这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任务都要等待处理.响应性很糟糕,吞吐量低.系统资源利用率低.2.显示的为任务创建线程为每个任务创建对应一个线程,响应快,系统资源利用路高.缺点是资源消耗原创 2015-03-01 14:09:17 · 504 阅读 · 0 评论 -
Java枚举类enum详解
枚举类enum是JDK1.5引入的,之前都是用public static final int enum_value来代替枚举类的。枚举类enum是一种特殊的类,它默认继承了类java.lang.Enum。和其它普通类一样,enum同样可以有成员变量、方法、构造器,也可以实现一个或多个接口,区别是:如果有构造器,必须用private修饰。枚举类不能派生子类。枚举类所有的实例必须在第一行显示定义。原创 2015-03-17 21:41:15 · 1082 阅读 · 0 评论 -
Java并发编程之栅栏(CyclicBarrier)详解
栅栏类似闭锁,但是它们是有区别的. 闭锁用来等待事件,而栅栏用于等待其他线程.什么意思呢?就是说闭锁用来等待的事件就是countDown事件,只有该countDown事件执行后所有之前在等待的线程才有可能继续执行;而栅栏没有类似countDown事件控制线程的执行,只有线程的await方法能控制等待的线程执行.CyclicBarrier强调的是n个线程,大家相互等待,只要有一个没完成,所有人都得原创 2015-03-17 10:25:41 · 8417 阅读 · 1 评论 -
EassyMock实践 自定义参数匹配器
虽然easymock中提供了大量的方法来进行参数匹配,但是对于一些特殊场合比如参数是复杂对象而又不能简单的通过equals()方法来比较,这些现有的参数匹配器就无能为力了。easymock为此提供了IArgumentMatcher 接口来让我们实现自定义的参数匹配器。 我们还是用例子来说话:要测试的接口 package MockTest;public in原创 2015-03-01 14:02:53 · 2314 阅读 · 0 评论 -
Java内存区域分析
程序计数器指令执行的指示器.每个线程都有独立的程序计数器,互无影响,我们称这类区域为线程私有的内存.执行Java方法,计数器记录的是正在执行的虚拟机字节码指令地址;如果执行的是native方法,这个计数器为空.此内存区域唯一一个没有规定任何OutOfMemoryError的区域.虚拟机栈Java虚拟机栈也是线程私有的,它的生命周期与线程相同.虚拟机栈描述的是Java方法执行的内存模型:原创 2015-03-17 10:14:09 · 688 阅读 · 0 评论 -
JVM垃圾回收算法和垃圾收集器笔记
概述程序计数器,本地方法栈,虚拟机栈随线程而生,随线程而灭. Java堆和方法区则不一样,这部分内存分配和回收的都是动态的,垃圾收集器所关注的是这部分内存.判断对象是否是垃圾的算法JVM没有选用引用计数算法来管理内存,最主要的是引用计数很难解决对象之间相互循环引用的问题.JVM采用了可达性分析算法来判断对象是否能回收.用GC Roots对象作为起点,向下搜索,搜索走过的路劲称为引用链(referen原创 2015-03-19 09:41:12 · 1002 阅读 · 0 评论 -
EassyMock实践 捕获参数
在测试接口过程中,有时我们希望知道自己期望传入的参数是什么,以此来判断传入参数的正确行,这时就需要用到EassyMock的capture方法.该方法能捕获传入的参数存放到自定义的变量中,然后用捕获的参数与期望的参数进行对比,从而判断调用接口时使用的参数是否正确.下面用例子演示一下:要测试的接口package MockTestWithCapture;public inte原创 2015-03-01 14:07:57 · 778 阅读 · 0 评论 -
理解Java的GC日志
分析如下GC日志: [GC [PSYoungGen: 9216K->1024K(9216K)] 1246196K->1246220K(1287040K), 0.2398360 secs] [Times: user=0.29 sys=0.01, real=0.24 secs] [Full GC [PSYoungGen: 1024K->0K(9216K)] [ParOldGen: 1245196K原创 2015-03-17 09:19:53 · 3442 阅读 · 0 评论 -
Java 初始化字段方式和顺序
Java 初始化字段方式和顺序:类加载时直接初始化静态字段;类加载时调用静态方法初始化静态字段;实例化对象时,在调用构造函数之前代码块中初始化字段;实例化对象时,在调用构造函数之时初始化字段; 初始化字段顺序1->2->3->4 代码如下:public class Employee {//实例化对象时,在调用构造函数原创 2015-03-01 14:06:24 · 1132 阅读 · 1 评论 -
Java并发编程之ThreadLocal类详解
ThreadLocal类可以理解为ThreadLocalVariable(线程局部变量),提供了get与set等访问接口或方法,这些方法为每个使用该变量的线程都存有一份独立的副本,因此get总是返回当前执行线程在调用set时设置的最新值。可以将ThreadLocal视为 包含了Map对象,保存了特定于该线程的值。概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式原创 2015-03-12 21:39:49 · 673 阅读 · 0 评论 -
多线程并发编程之原子变量与非阻塞同步机制
1.非阻塞算法非阻塞算法属于并发算法,它们可以安全地派生它们的线程,不通过锁定派生,而是通过低级的原子性的硬件原生形式 —— 例如比较和交换。非阻塞算法的设计与实现极为困难,但是它们能够提供更好的吞吐率,对生存问题(例如死锁和优先级反转)也能提供更好的防御。使用底层的原子化机器指令取代锁,比如比较并交换(CAS,compare-and-swap).2.悲观技术独占锁是一种悲观的技术.它假设最坏的情况原创 2015-03-01 13:52:17 · 736 阅读 · 0 评论 -
Java类文件结构笔记
概述一次编写,处处运行(Write Once, Run Anywhere).各种平台的虚拟机与所有平台都统一使用的程序存储格式-字节码(ByteCode).Java虚拟机不和包括Java在内任何语言绑定,它只与Class文件锁关联.因此Groovy,JRuby,Jython,Scala都可以在Java虚拟机上运行.Class类文件结构Class文件是一组以8字节为基础单位的二进制流,中间没有原创 2015-03-22 12:31:11 · 733 阅读 · 0 评论 -
设计模式之生成器模式(Builder)-创建模型
1.意图将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.2.适用性 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 当构造过程必须允许被构造的对象有不同的表示时。 3.结构4.参与者 Builder: 为创建一个Product对象的各个部件指定抽象接口。 ConcreteBuilder: 实现Builder的接口以构原创 2015-03-05 09:33:02 · 737 阅读 · 0 评论 -
设计模式之桥接模式(Bridge)--结构模型
1.意图将抽象部分与它的实现部分分离,使它们可以独立地变化.2.适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。 类的抽象与它的实现都应该可以通过子类的方式加以扩展。 抽象部分与实现部分可以独立变化,而不会相互影响。 从多维度扩展应用程序。 3.结构4.参与者 Abstraction: 定义抽象的接口;维护一个指向Implementor对象的引用。原创 2015-03-05 09:07:10 · 1249 阅读 · 0 评论 -
Maven生命周期
####概念 Maven的生命周期是为了所有构建过程进行抽象和统一.Maven生命周期是抽象的,具体实现由插件完成.这种思想和设计模式中的模板方法非常相似.模拟Maven生命周期代码public abstract class t { public void build() { initialize(); compile(); test();原创 2015-03-12 17:27:14 · 800 阅读 · 0 评论