存档: 七月, 2010

初为项目经理应该注意的地方

4 条评论 2010年7月18日

这一周被领导安排分析项目的数据库设计时候合理、监督同事的工作情况、检查项目的进展情况、对某些业务功能进行分析设计数据库,五天工作中天天加班,整个人累的实在是不行。以前是在项目中上班时候写写代码,完成任务后就回家看自己感兴趣的技术;现在却是,每天不用代码,要检查别人的工作情况,分析每个人的代码质量,要讨论业务需求要设计数据库,大家下班了,我却还在公司一个一个页面的检查bug一个一个代码的检查代码质量。。。。。。

这就是我这一周的主要任务,忙碌是其关键词,加班到四点半是生平的第一次。

以前是只写代码,现在要学着去管理整个团队,把握整个项目的进度,角色的转变真的是很困难! 继续阅读…

数据迁移的一些总结

3 条评论 2010年7月17日

做了一段时间的数据迁移工作,遇到了不少问题,积累了一些经验,现将自己在这段时间的工作总结与体会记录下来,为以后的数据迁移增加经验!
第一次执行数据迁移程序的时候,发现代码执行效率低,虚拟机占用内存太大,于是就想办法提高代码运行效率并增大java虚拟机内存(设置参数:-Xms300m -Xmx512m). 继续阅读…

Java设计模式之Singleton

2 条评论 2010年7月9日

Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 singleton能够被状态化也能被无状态化,通常是用在工具类里,实现单线程的操作。

第一种:注册型的模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class RegSingleton {
	static private HashMap m_registry = new HashMap();
	static {
		RegSingleton x = new RegSingleton();
		m_registry.put(x.getClass().getName(), x);
	}
 
	protected RegSingleton() {
	}
 
	static public RegSingleton getInstance(String name) {
		if (name == null) {
			name = "RegSingleton";
		}
		if (m_registry.get(name) == null) {
			try {
				m_registry.put(name, Class.forName(name).newInstance());
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
		return (RegSingleton) (m_registry.get(name));
	}
}

第一种:饥渴型的模式:

1
2
3
4
5
6
7
8
9
10
public class EagerSingleton {
	private static final EagerSingleton m_instance = new EagerSingleton();
 
	private EagerSingleton() {
	}
 
	public static EagerSingleton getInstance() {
		return m_instance;
	}
}

第一种:懒汉型的模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class LazySingleton {
	private static LazySingleton m_instance = null;
 
	private LazySingleton() {
	}
 
	public static LazySingleton getInstance() {
		if (m_instance == null) {
			synchronized (LazySingleton.class) {
				if (m_instance == null) {
					m_instance = new LazySingleton();
				}
			}
		}
		return m_instance;
	}
}

第一种方式很少有人使用,因为其没有考虑到多线程并发的情况;第二种方式,在自己内部定义自己一个实例,并提供了一个供外部访问本class的静态方法;第三种方式不用每次都进行生成对象,只是第一次使用时生成实例,提高了效率!仔细看第三种方式,其采用了双重验证m_instance是否为空的方式,并且在方法内部对对象加了同步方法。这种方式看清来万无一失,其实还是有欠妥的地方,深究下去,这就涉及到到double-checked locking (DCL)的讨论。具体讨论,可以参照以下文档:
Double-checked locking and the Singleton pattern
When is a singleton not a singleton?
从上面的文章,可以知道第三种方式并不能解决问题,在第三种方式的方法里设置临时变量也不能解决问题(因为虚拟机会进行优化操作),使用volatile 关键字也不是可靠的方法(因为不同虚拟机对其实现不一致),最可靠的的方法也是最初最容易想到和写出的方法也就是对方法加同步锁。虽然,对整个方法加同步锁,会耗很多资源,但是保证线程安全最可靠的方法了。
最可靠的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class LazySingleton {
	private static LazySingleton m_instance = null;
 
	private LazySingleton() {
	}
 
	public synchronized static LazySingleton getInstance() {
		if (m_instance == null) {
			m_instance = new LazySingleton();
		}
		return m_instance;
	}
}

动态改变java的父类

2 条评论 2010年7月8日

在java开发中难免会重用代码,但有时候会觉得此代码用在彼处不是很合理,于是需要手动的修改代码,有没有一种简单的方式让不直接拷贝代码过来不修改代码而使用(注意不是直接使用,也不可能直接使用)呢?这样说比较抽象,举个实际项目中遇到的例子,现在又一个类继承另一个类,我想改变他的父类类型(类中的方法属性不变,改变后的父类和改变之前的类肯定存在一些关系的),将其用在另一个项目里,这时候我就想动态的改变java的父类。 继续阅读…

渐行渐远

没有评论 2010年7月4日

今天是一个很特殊的日子,毕业一周年,来京一周年,世界悲,几件事情夹杂在一起,内心有些怀念,有些疲惫,有些伤感,有些期待!
世界杯. 继续阅读…