Java中奇怪而又无可厚非的类加载顺序
昨天看到这样一篇帖子,讨论类加载顺序的,也可以说是初始化顺序的,今天早上找不到了,本来想回复的,现在自己写博客回复了,呵呵
public class Singleton {
private static Singleton obj = new Singleton();
public static int counter1 ;
public static int counter2 = 0;
private Singleton()
{
counter1++;
counter2++;
}
public static Singleton getInstance()
{
return obj;
}
public static void main(String[] args) {
Singleton.getInstance();
System.out.println("obj.counter1=="+counter1);
System.out.println("obj.counter2=="+counter2);
}
}
我不了解为什么obj.counter1=1,obj.counter2=0.希望给我说说
刚开始也很迷茫,我想不通的问题是什么时候声明的变量count1、count2?
以前的理解它的执行顺序应该是这样的:
1、加载类,当然首先执行的是
private static Singleton obj = new Singleton();
2、所以出现了对中对象的创建,于是执行构造方法:
private Singleton()
{
counter1++;
counter2++;
}
3、按照顺序,应该执行下一条语句,即:
public static int counter1 ;
public static int counter2 = 0;
好了,类的加载过程完成了。
现在才开始执行main方法的第一条语句,随后的结论都成立了。
现在的问题出现了:什么时候声明的变量count1、count2?
查询了一些资料,终于解决了,我认为应该是这样的:
类加载的顺序其实以上的说法是有误的,也就是以前的理解是存在偏差的,除非出现想文章这样的程序才会暴露出来。好了,废话少说,看看真正的类加载顺序:
类加载分为三个过程:装载、链接、初始化。
装载的过程就是将class文件读入内存的过程,并且提取其中的类关键信息,比如:方法、变量等等。
而在链接中存在三个步骤:
a、进行字节码的检查,看是否符合class文件规范;
b、对类中的类变量进行分配空间,附初始值。此处专指基本类型。
c、对类中的引用变量进行分配空间
相关文档:
Java 语言是一种具有动态性的解释型编程语言,当指定程序运行的时候, Java 虚拟机就将编译生成的 . class 文件按照需求和一定的规则加载进内存,并组织成为一个完整的 Java 应用程序。 Java 语言把每个单独的类 Class 和接口 Implements 编译成单独的一个 . class 文件,这些文件对于 Java 运行环境来说就是一个个可以动态 ......
多线程读写同一个对象的数据是很普遍的,通常,要避免读写冲突,必须保证任何时候仅有一个线程在写入,有线程正在读取的时候,写入操作就必须等待。简单说,就是要避免“写-写”冲突和“读-写”冲突。但是同时读是允许的,因为“读-读”不冲突,而且很安全。
要实现以上的ReadWriteLock, ......
使用java中的动态代理可以完成很多事情,比如将业务实例进行托管,实现AOP等,但是Php中没有实现这样的东西,昨天突然想到其实可以通过eval来模拟一个动态代理机制。php比java不同的是,php是不需要编译的,因此只要我们能够动态生成一段代码,然后用eval来执行就可以达到效果。代码如下:
/**
* 代理实现类
*/
inter ......
php和java通用sql语句法
SELECT max(id) from table
该方法在多线程等情况下可能会造成不正确。
java三种方法
1、根据ps的getGeneratedKeys
PreparedStatement ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); //红色是关键
ps.executeUpdate(); //执行后
ResultSet rs = ps.getGeneratedKeys ......
package org.rut.util.algorithm.support;
import org.rut.util.algorithm.SortUtil;
/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class InsertSort implements SortUtil.Sort{
/* (non-Javadoc)
* ......