- 浏览: 253773 次
- 性别:
- 来自: 上海
最新评论
-
探索者_技术:
不错 讲解的比较详细
Java 执行过程详解 - JVM 生命周期 -
besterzhao:
学习了
关于 sun.misc.Unsafe -
lliiqiang:
属性变量被设定为不可更改的,外界传递的对象复制一份再保存到对象 ...
不可变类(immutable class) -
xunke515:
有启发.感谢
Java System 类详解 - in, out, err -
bo_hai:
你说没错。问题是:怎么样把ClassA中的事务传播到Class ...
Spring 事务在多线程环境下的传播
文章列表
众所周知,Spring以其强大而又灵活的IoC管理功能著称。IoC本质上是通过依赖注入DI的方式实现组件之间的解耦。其实在DI模式下,一个关键性的角色是装配器(assembler)。应用程序的组件A在引用别的组件B的时候不用通过new来创建,而是依赖一个第三方的装配器创建好B,然后再通过setter或者constructor来注入给A,这样A只管用B的接口,而不需要知道B的存在,从而实现了A与B的解耦。也实现了面向抽象(接口)编程。
Spring框架里面谁来充当这个assembler的角色呢?是BeanFactory。Spring提供了品种繁多的BeanFactory,共用户在不同场合下使用。 ...
分析appfuse的详细的启动日志来看看Spring的启动过程。
1. 装载app上下文
main INFO org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization started
。。。。。。。。。。
main INFO org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 22509 ms
这里是通过 ...
千里之行,始于足下。结合例子学习概念,比较靠谱。本文介绍如何开始从appfuse开始学习Spring和Hibernate。
如果你还没有安装mysql,请先安装。同时也建议你安装一个workbench来方便管理数据库。
1. 利用Maven构建appfuse项目
万能的Maven提供了很多丰富的Archetype让你可以轻松构建一个包含了你想使用的框架的基本项目,而避免让你从零开始。你可以在这里(http://docs.codehaus.org/display/MAVENUSER/Archetypes+List)查看Maven提供的所有Archetype。
在命令行输入下面的命令,你就可以根据 ...
有时候需要使用多线程来提高对于CPU,尤其是多核CPU的利用率,来提高性能。Spring的bean一般都是无状态的,单例的。所以也就是线程安全的。那么对于声明式的事务,在多线程环境下又是怎么处理的呢?
看看下面的例子:
ClassA.java
@Transactional
public void methodA(){
ExecutorService executorService = Executors.newFixedThreadPool(4);
executorService.execute(new Runnable() {
p ...
在功能上讲Hashtable和HashMap, Vector和ArrayList有着几乎相同的功能。他们的主要区别在于:
Hashtable和HashMap的区别,先看put方法的源代码
Hashtable
public synchronized V put(K key, V value) {
// Make sure the value is not null
if (value == null) {
throw new NullPointerException();
}
// Makes sure the key is not already in the ...
最近再看Java 性能的问题。一直都习惯使用Jconsole和Jstack。今天偶然发现一个更好的东东JVisualVM。这个工具功能更强大而且有很多插件可以扩展,相信后面插件会越来越丰富。
如此一来一些简单的profiling和monitoring需求都可以满足了,而不必使用JProfile和YourKit了。
JVisualVM是JDK自带的一个使用工具。如果你的path里面包含java的bin目录,你可以直接在命令行敲JVisualVM来打开它。
你可以连接本机,也可以连接远程的机器,不过要通过jmx。需要做下面的设置:
set JAVA_OPTS=-Dcom.sun.management ...
为了性能和内存资源上的考虑,JVM对String类型的数据做了特殊的处理。也就是大家都知道的String是immutable的或者是constant。其实很多面试或者笔试里面都会考到。有时觉得没事找事,确实,对于一般的系统,不需要考虑到底创建 ...
在学习Tomcat 7 的源代码的时候发现,大量运用到了JMX, MBeans,所以决定先学习一下。
介绍
JMX是Java 5开始引入的API。这个API意在帮助管理和监控资源: applications, devices, services, and the Java virtual machine. 你可以用JMX API来:
查询和修改应用配置
应用行为统计
状态改变和出错通知
你也可以远程的访问JVM,从而远程管理和监控。
MBean, managed bean,受管的bean
Mbean其实也是一种Java Bean,特别之处就在于它是在管理之下的。所谓 ...
Bootstrap 在启动的时候初始化了三种class loader:common,server和shared。在它的createClassLoader方法里面,通过:
String value = CatalinaProperties.getProperty(name + ".loader");
来得到属性文件catalina.properties里面获得他们的配置:
common.loader=${ ...
先大致浏览一下整个启动过程吧。下面是org.apache.catalina.startup.Bootstrap的main函数。
我在eclipse调用的是start的命令,也就是传入main的参数是start
// 初始化, 构建org.apache.catalina.startup.Catalina实例,并赋值给catalinaDaemon
bootstrap.init();
// ...
准备好好研究学习一下tomcat 7 的源代码,那么第一步就是下载,导入eclipse并且运行。
1. 下载源代码
tomcat 7 的源代码在svn上,所以你需要svn的安装。创建一个目录tomcat7,并用命令行进入这个目录,之后用下面的命令下载
svn co http://svn.apache.org/repos/asf/tomcat/tc7.0.x/tags/TOMCAT_7_0_27/ ./
这里我下载的是tag里面的,你也可以下载别的branch,比如trunk,但是我觉得tag的是比较稳定的。
2. 创建eclipse项目
tomcat 7 是用ant来构建和管理的,所以 ...
泛型是Java 5开始引入的一个语言级别的特性,目的是为了让你的程序更为可靠(reliable)。
程序总是有bug,而bug分为编译时bug和运行时bug,编译时bug是比较令人舒服的bug,因为大部分的IDE比如eclipse,就能让你在写代码的时候就能发现并及时fix。但是运行时bug就很难受了,必须在运行时的某个条件下才能出现,当你想去找它的时候还不一定那么好找,尤其是多线程环境下的bug,更难重现。我们如果能尽量使bug可以在编译时发现,那就再好不过了。
泛型的引入就是为了让你尽量在编译时就发现某些类型的bug。典型的例子就是Collec ...
Java的执行过程也就是JVM从启动到退出的过程。JVM的运行是一个进程单元,可以用jps工具列举出正在运行的JVM 进程。在一个JVM进程中可以运行多个线程。
1. JVM 启动
当用java工具运行一个编译好的class文件的时候,比如下面的命令,我们就通过调用Test的main函数启动了一个JVM进程。并且传给main函数一个字符串数组{"reboot", "Bob", "Dot", "Enzo"}
java Test reboot Bob Dot Enzo
2. 加载类Test
如果JVM发现Test类还没有 ...
在环境配置中我们经常需要知道或者设置系统属性值和环境变量。系统属性值是在同一个Java process里面有效的全局变量。而环境变量则是对于整个操作系统中所有进程都可见的,就如同你在OS里面设置的一样。因此除非必要,或者你确实需要环境变量,比如classpath和path,一般推荐使用properties。比如log4j的属性文件的使用。
下面的代码可以打印出所有的系统变量和环境变量:
package jdk.lang;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map; ...
System类提供了数组copy函数:
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
从参数列表上看,src和dest都是Object,说明可以copy任意数组。那么我们知道数组既可以是原始类型值的数组,也可以是对象类型的数组。如果是原始类型的数组,copy的就是值,如果是对 ...