
JAVA技巧
文章平均质量分 73
EthanPark
中科大硕士. 擅长领域高并发企业级应用性能优化。喜爱钻研源码。业余参与国外Spring以及Servlet,JDBC等Spec的翻译。
展开
-
FindBug:Call to static DateFormat
今天在重构代码的过程中碰到了一个问题。使用SimpleDateFormat的问题。 本人今天写了一个类,主要是提供很多静态的方法由其他接口调用,过程中多个方法使用到了日期的格式化,所以我讲SimpleDateFormat声明为了static 变量,结果在使用findBug插件对文件进行检索的时候,碰到了问题。 STCAL: Call to static DateFormat (STCAL_IN原创 2015-07-29 18:11:56 · 3338 阅读 · 0 评论 -
Java线程和多线程(六)——守护线程
当我们在Java中创建线程的时候,这个线程在默认的情况下是一个用户线程,并且,如果这个线程在运行,那么JVM就不会终结这个应用。和用户线程不同,当一个线程被标记为守护线程的时候,JVM在用户线程结束的时候,是不会持续等待守护线程结束的,而是直接结束程序,并且结束程序中相关的守护线程。Thread.setDaemon(true)方法可以用来将线程置为守护线程,参考下面的例子:package com.s原创 2016-09-20 13:11:00 · 3187 阅读 · 1 评论 -
Java线程和多线程(七)——ThreadLocal
Java中的ThreadLocal是用来创建线程本地变量用的。我们都知道,访问某个对象的所有线程都是能够共享对象的状态的,所以这个对象状态就不是线程安全的。开发者可以通过使用同步来保证线程安全,但是如果不希望使用同步的话,我们也可以使用ThreadLocal变量。Java ThreadLocal其实每个线程都有自己的ThreadLocal变量,并且这个变量可以通过get()和set()方法来获取默认原创 2016-09-24 18:16:04 · 2521 阅读 · 1 评论 -
Spring核心技术(一)——IoC容器和Bean简介
IoC容器和Bean简介这章包括了Spring框架对于IoC规则的实现。Ioc也同DI(依赖注入)。而对象是通过构造函数,工厂方法,或者一些Set方法来定义对象之间的依赖的。容器在创建这些Bean对象的时候同时就会注入这些依赖。这个过程是根本上的反转了,不再由Bean本身来控制实例化和定位依赖,而是通过服务定位来控制这个过程,也是IoC(控制反转)的由来。org.springframew翻译 2016-05-06 10:41:05 · 6700 阅读 · 5 评论 -
Spring核心技术(十五)——BeanFactory
BeanFactory是Spring IoC功能的潜在基础,但是现在BeanFactory一般仅仅用于直接集成第三方的框架,对于大多数的Spring用户来说,BeanFactory已经算是一个历史了。BeanFactory以及其相关的接口,包括BeanFactoryAware,InitializingBean,DisposableBean,出于跟大量第三方框架兼容的问题,仍然存在。因为很多时候,第三翻译 2016-09-26 23:02:35 · 1817 阅读 · 2 评论 -
Java线程和多线程(十一)——BlockingQueue
这次讨论的是Java的BlockingQueue,java.util.concurrent.BlockingQueue是一个Java的队列接口,支持一系列操作,比如,在获取和移除对象的时候如果队列为空会来等待队列变成非空的,而当队列满了的时候,插入元素会等待队列中的元素被移除,保证队列有空余的空间。Java的BlockingQueue是不能接受null的值,如果传入null将会跑出NullPoint原创 2016-10-22 18:51:38 · 3587 阅读 · 0 评论 -
Spring核心技术(二)——Spring的依赖及其注入
本文将继续前文,描述Spring IoC中的依赖处理。一般的企业应用也不会只有一个对象(或者是Spring Bean)。甚至最简单的应用都要有一些对象来协同工作来让终端用户看到一个完整的应用。下一部分将解释开发者从单独的定义Bean,到让这些对象在一个应用中协同工作。依赖注入依赖注入是一个让对象只通过构造参数,工厂方法的参数或者配置的属性来定义他们的依赖。这些依赖也是对象所需要协同工作的对象。容翻译 2016-05-11 11:04:56 · 9247 阅读 · 7 评论 -
Spring核心技术(三)——Spring的依赖及其注入(续)
本文将继续前文,针对依赖注入的细节进行描述依赖注入细节如前文所述,开发者可以通过定义Bean的依赖的来引用其他的Bean或者是一些值。Spring基于XML的配置元数据支持一些子元素<property/>以及<constructor-arg/>来达到这一目的。内在值类型(Java Primitives类型,字符串等)元素<property/>有value属性来以易读的形式配置一个属性或者构造参数。S翻译 2016-05-16 12:20:00 · 10952 阅读 · 2 评论 -
Spring核心技术(四)——Spring的依赖及其注入(续二)
前面两篇文章描述了IoC容器中依赖的概念,包括依赖注入以及注入细节配置。本文将继续描述玩全部的依赖信息。使用 depends-on如果一个Bean是另一个Bean的依赖的话,通常来说这个Bean也就是另一个Bean的属性之一。多数情况下,开发者可以在配置XML元数据的时候使用<ref/>标签。然而,有时Bean之间的依赖关系不是直接关联的。比如:需要调用类的静态实例化器来出发,类似数据库驱动注册。d翻译 2016-05-18 16:45:23 · 11037 阅读 · 2 评论 -
Java线程和多线程(八)——Thread Dump
Java的Thread Dump就是列出JVM中所有激活状态的线程。Java Thread DumpJava Thread Dump在分析应用性能瓶颈和死锁的时候,是非常有效的。下面将介绍多种不同的方式来获取Java程序的Thread Dump信息。这些指令在*nix型的操作系统下是有效的,但是在Windows下面,采取的方式会有一些不同。(主要是Pid信息获取不太一致,可通过任务管理器获取)Vi原创 2016-09-27 22:54:51 · 10911 阅读 · 1 评论 -
Java线程和多线程(九)——死锁
Java中的死锁指的就是一种多于两个线程永远阻塞的特殊状况。Java中的死锁状态至少需要多于两个线程以及资源的时候才会产生。这里,我写了一个产生死锁的程序,并且讲下如何分析死锁。首先来看一下产生死锁的程序:package com.sapphire.threads;public class ThreadDeadlock { public static void main(String[] arg原创 2016-10-13 20:45:49 · 3506 阅读 · 2 评论 -
Spring AOP(一)——基础概念
前文的一些内容更多是针对Spring容器内部的一些特性的描述,接下来一个专题将描述Spring AOP的一些信息,配置细节等等。介绍面向切面编程(AOP)是一种新的针对程序结构的思路,它补足了面向对象编程(OOP)的一些细节上的不足。OOP的关键在于模块化概念,也就是Java中的class。而AOP关心的模块则是切面。切面关心的模块化主要是考虑的是诸如事物管理这类会跨越多个类型和对象的一些方面。(而翻译 2016-10-12 23:39:12 · 20080 阅读 · 0 评论 -
Java线程和多线程(十)——TimerTask
Java中的java.util.Timer是一个工具类,可以用于调度一个线程在将来的某一个时刻执行特定的任务。Java Timer类可以将一个任务定时执行一次,或者是以后以每隔一定的时间间隔来触发一次。Java TimerTaskjava.util.TimerTask是一个抽象类,也同时实现了Runnable接口的。我们可以继承这个类来创建我们自己的TimerTask之后由Timer来调度。Java原创 2016-10-15 19:12:46 · 7837 阅读 · 1 评论 -
Java线程和多线程(十二)——线程池基础
Java 线程池管理多个工作线程,其中包含了一个队列,包含着所有等待被执行的任务。开发者可以通过使用ThreadPoolExecutor来在Java中创建线程池。 线程池是Java中多线程的一个重要概念,因为通过Thread模型来控制多线程是非常麻烦以及易错的一个过程。过多的释放线程会造成线程调度的变慢以及过度的消耗内存。而频繁的创建线程,也没有很好的复用线程,所以有了线程池的概念。Java中的原创 2016-10-30 11:12:43 · 10357 阅读 · 0 评论 -
Spring核心技术(五)——Spring中Bean的作用域
前文概述了Spring的容器,Bean,以及依赖的一些信息,本文将描述一下Bean的作用域Bean的作用域当开发者定义Bean的时候,同时也会定义了具体如何创建Bean实例的步骤。这些步骤是很重要的,因为只有通过这些配置,开发者才能创建实例对象。开发者不仅可以控制多种多样的依赖到Bean之中,也可以配置Bean的作用域。这种方法是非常强大而且弹性也非常好,开发者可以通过配置来指定对象的作用域,而不用翻译 2016-05-22 18:23:58 · 20967 阅读 · 1 评论 -
Java线程和多线程(十三)——Callable,Future,FutureTask
在Java多线程之中,Callable和Future的使用时非常广泛的。在之前的文章中,我们了解了关于Java线程池基础的一些内容,知道如何提交Runnable的任务。但是,Runnable的任务是无法有返回值,也不能抛出异常的。而有些时候,我们希望一个线程能够有一些返回值。在Java 5中,引入了java.util.concurrent.Callable接口,这个接口很类似于Runnable接口,原创 2016-11-02 10:49:46 · 6289 阅读 · 4 评论 -
Java内存管理(一)
Java相比传统语言(C,C++)的一个优势在于其能够自动管理内存,从而将开发者管理内存任务剥离开来。 本文大体描述了J2SE 5.0 release中JVM对于内存是如何管理的。并且为选择和配置对应的收集器,配置收集器的参数提供了一些建议和参考。手动VS自动内存管理内存管理是能够识别哪些释放的对象不再使用,释放掉这些对象所占用空间的一个原创 2017-04-20 20:50:44 · 3440 阅读 · 0 评论 -
Java内存管理(三)——卡片表
在垃圾回收的过程中,会碰到一个问题,就是老年代中的对象可能引用年轻代中的对象。在这种情况下,每次遍历老年代的对象来查找所有存活对象的时候就会消耗相当的时间。而且,在应用中,通常来说,这种引用是非常少的(某些研究表明,这种情况的引用占总引用量的1%都不到)。但是这些引用需要遍历整个老年代对象是一个相当大的Overhead。Card-tableJVM中会维护一个卡片表的数据结构,主要用于查看老年代中指向原创 2017-05-24 15:34:33 · 3301 阅读 · 0 评论 -
Java线程和多线程(五)——单例类中的线程安全
单例模式是最广泛使用的创建模式之一。在现实世界之中,诸如Databae的连接或者是企业信息系统(EIS)等,通常其创建都是受到限制的,应该尽量复用已存在对象而不是频繁创建销毁。为了达到这个目的,开发者通常会通过实现单例模式来创建一个wrapper类,来封装资源,限制其运行时所创建对象的个数。单例中的线程安全总的来说,开发者一般会按照如下的方式来创建单例的类:使用私有构造函数来避免其它外部引用通过n原创 2016-09-17 15:05:59 · 2010 阅读 · 1 评论 -
Java线程和多线程(一)——线程的基本概念
Java 线程是一个轻量级执行任务的处理单元。Java提供了Thread类来支持多线程,开发者在应用中可以创建多个线程来支持并发执行任务。在应用中存在两种类型的线程,用户线程和守护线程。当我们启动应用的时候,main函数是第一个启动的用户线程,开发者可以在之后自由的创建用户线程。当所有的线程执行完毕,JVM会终结掉程序。开发者也可以配置不同线程的优先级,但是这并不代表更高优先级的线程会比低优先级的线原创 2016-06-21 10:27:55 · 3126 阅读 · 1 评论 -
Quartz 配置
数据库中经常有对数据库账号密码的加密,但是碰到一个问题,在使用UserService对密码进行加密的时候,spring security 也是需要进行同步配置的,因为spring security 中验证的加密方式是单独配置的。如下:<authentication-manager> <authentication-provider user-service-ref="userDetailSe原创 2016-01-11 17:15:26 · 858 阅读 · 0 评论 -
数据库账号密码加密
数据库中经常有对数据库账号密码的加密,但是碰到一个问题,在使用UserService对密码进行加密的时候,spring security 也是需要进行同步配置的,因为spring security 中验证的加密方式是单独配置的。如下:<authentication-manager> <authentication-provider user-service-ref="userDetailS原创 2016-01-11 17:16:54 · 1967 阅读 · 0 评论 -
maven 测试写入JRE参数
项目在测试时碰到一个问题,就是JVM加载参数的问题。 web项目本身在注入配置信息的时候,读取的是本地的配置文件,但是配置文件的位置是卸载tomcat 里面配置的JAVA_OPTS里面的。 问题出现了: JAVA_OPTS将变量写入了JRE,但是在执行maven test的时候,是没有写入JRE参数的,所以在进行诸如service等涉及到数据库的测试的时候,将无法正确加载数据库的配置,导致无原创 2016-01-11 17:31:03 · 1649 阅读 · 0 评论 -
HashMap源码分析(一)
最近开始看Collections部分源码,之前比较了C#中List和Java中的ArrayList的异同,今天来分析一下Java中的HashMap源码HashMap实现了很多的接口,这次主要分析的是Map接口Map interfacecontainsKey方法containsKey方法跟Get方法本质上类似,一个判断是否包含,一个判断其中是获取其值首先检查一下containsKey的注释 /**原创 2016-03-08 11:59:00 · 874 阅读 · 0 评论 -
Servlet 3.1 标准(一)
概述什么是ServletServlet 是一个基于Java 的Web组件,由容器管理生成的动态内容。就像其他的Java组件一样,Servlet是平台无关的Java类所编译成的字节码,可以被动态加载在基于的Java Web容器之中。 容器,有时候也被乘坐Servlet引擎,是一些提供Servlet功能的 Web服务器扩展。 Servlet 和Web 客户端通过 Servlet容器所实现的请求/应答的翻译 2016-03-09 16:46:04 · 1901 阅读 · 0 评论 -
Spring核心技术(六)——Spring中Bean的生命周期
前文已经描述了Bean的作用域,本文将描述Bean的一些生命周期作用,配置还有Bean的继承。定制Bean生命周期回调开发者通过实现Spring的InitializeingBean和DisposableBean接口,就可以让容器来管理Bean的生命周期。容器会调用afterPropertiesSet()前和destroy()后才会允许Bean在初始化和销毁Bean的时候执行一些操作。 JSR-2翻译 2016-05-29 18:44:18 · 28773 阅读 · 4 评论 -
Spring核心技术(七)——Spring容器的扩展
本文将讨论如何关于在Spring生命周期中扩展Spring中的Bean功能。容器的扩展通常来说,开发者不需要通过继承ApplicationContext来实现自己的子类扩展功能。但是Spring IoC容器确实可以通过实现接口来增加一些功能。下面将描述一下这些接口。通过BeanPostProcessor定义BeanBeanPostProcessor接口定义了一些回调方法,开发者可以通过实现来自己的实翻译 2016-06-07 10:51:05 · 7164 阅读 · 0 评论 -
Spring核心技术(八)——Spring自动装载的注解
本文针对自动装载的一些注解进行描述。包括@Required,@Autowired,@Resource等翻译 2016-06-24 16:31:52 · 9606 阅读 · 7 评论 -
Spring核心技术(九)——Spring管理的组件和Classpath扫描
本文主要描述了Spring所管理的组件,Spring是如何通过classpath的扫描来自动将组件注册为Bean的以及Spring自动注册所涉及的一些相关知识翻译 2016-07-10 21:36:30 · 5181 阅读 · 0 评论 -
Spring核心技术(十)——JSR-330标准注解
从Spring 3.0开始,Spring开始支持JSR-330标准的注解(依赖注入)。这些注解和Spring注解扫描的方式是一直的,开发者只需要在classpath中配置相关的jar包即可。 如果开发者使用Maven来管理项目的话,javax.injectartifact在Maven仓库中是可用的(http://repo1.maven.org/maven2/javax/inject/javax.翻译 2016-07-11 12:32:23 · 9931 阅读 · 0 评论 -
Spring核心技术(十一)——基于Java的容器配置(一)
本文概述了如何通过使用Java而非XML来配置Spring容器。其中包括Bean的构建,@Configuration注解,@Bean注解等等的用法翻译 2016-07-27 23:06:19 · 2843 阅读 · 0 评论 -
Spring核心技术(十二)——基于Java的容器配置(二)
@Configuration注解是一个类级别的注解,表明该对象是用来指定Bean的定义的。@Configuration注解的类通过@Bean注解的方法来声明Bean。通过调用注解了@Bean方法的返回的Bean可以用来构建Bean之间的相互依赖关系,可以通过前文来了解其基本概念。注入inter-bean依赖当@Bean方法依赖于其他的Bean的时候,可以通过在另一翻译 2016-07-30 23:46:45 · 2546 阅读 · 0 评论 -
Spring核心技术(十三)——环境的抽象
本章将描述一下Spring中针对环境的抽象。Environment是一个集成到容器之中的特殊抽象,它针对应用的环境建立了两个关键的概念:profile和properties.profile是命名好的,其中包含了多个Bean的定义的一个逻辑集合,只有当指定的profile被激活的时候,其中的Bean才会激活。无论是通过XML定义的还是通过注解解析的Bean都可以配置到profile之中。而Enviro翻译 2016-08-16 13:35:46 · 3058 阅读 · 2 评论 -
Java 下实现Cache
最近在做Spring的项目,想做一个缓存,访问数据库,定期来做数据更新 要实现两个功能可以通过http请求来立刻刷新缓存缓存可以通过自己配置的时间间隔来定期刷新通过Controller来做因为需要通过http来刷新缓存,所以第一个想法就是把缓存做成一个ControllerController的实现Controller最大的优势,就是可以通过Spring的配置,注入很多依赖,比如对Servic原创 2016-04-28 22:17:49 · 2808 阅读 · 2 评论 -
Java线程和多线程(四)——主线程中的异常
作为Java的开发者,在运行程序的事后会碰到主线程抛异常的情况。如果开发者使用Java的IDE比如Eclipse或者Intellij IDEA的话,可能是不需要直接面对这个问提的,因为IDE会处理运行类来处理这些问题。下面将描述一些在命令行模式下运行Java程序可能会碰到的异常。java.lang.UnsupportedClassVersionError这个异常时因为你的Java类是由另一个其他版本原创 2016-08-16 11:01:20 · 3981 阅读 · 1 评论 -
Java线程和多线程(三)——线程安全和同步
线程安全在Java中是一个很重要的课题。Java提供的多线程环境支持使用Java线程。我们都知道多线程共享一些对象实例的话,可能会在读取和更新共享数据的事后产生数据不一致问题。线程安全之所以会产生数据的不一致问题,是因为更新实例变量等类似的行为并非是源自操作。这类操作会有三个步骤:读取当前的值做一些必要的操作来获取更新的值讲更新的值写会变量之中原创 2016-08-01 18:04:05 · 2192 阅读 · 1 评论 -
Java线程和多线程(二)——对象中的wait,notify以及notifyAll方法
在Java的Object类中包含了3个final的方法,这三个方法允许线程来交流资源是否被锁定。这三个方法就是wait(),notify()以及notifyAll().在对象上调用这三个方法的线程需要包含一个对象监视器(锁),否则就会抛出java.lang.IllegalMonitorStateException异常。wait方法对象的wait方法由三个,一个是令对象等待任何线程来调用notify或原创 2016-07-15 13:07:21 · 1891 阅读 · 1 评论 -
Java内存管理(二)
前文描述了一些关于串行收集器的知识,本文继续针对垃圾收集器进行描述。并行收集器(parallel collector)在硬件发展到今天,很多的机器上面的物理内存会更高,并且拥有更多的CPU资源。并行收集器,也被称作吞吐收集器,就是用来更好的利用多个CPU性能,增加垃圾回收的吞吐量的一种垃圾收集器。并行收集器的年轻代回收年轻代使用的算法在串行收集器和并行收集器上是一致的。只是使用了多个CPU,通过降低原创 2017-04-29 15:23:13 · 1702 阅读 · 0 评论