java 性能优化读书笔记(一)

1、单例模式:
单例模式A

public class Singleton {
private Singleton() {

}
private static Singleton instance = new Singleton();

public static Singleton getInstance() {
return instance;
}

}

效率最快开始加载的时候就优化。缺点就是没办法延迟加载

单例模式B

public class LazySingleton {

private LazySingleton() {

}

private static LazySingleton instance = null;

public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}

}

可以延迟加载但是由于使用了synchronized 效率下降。

单例模式C

public class StaticSingleton {
private StaticSingleton(){

}

private static class SingletonHolder{
private static StaticSingleton instance = new StaticSingleton();
}

public static StaticSingleton getInstance(){
return SingletonHolder.instance;
}

}

通过内部类来加载,这样加载类的时候不会生成对象。而且内部类中也是加载时候完成,这样可以做到线程安全

最后说下单例模式可能失效的地方:
[color=red]1、反射类的私有方法。
2、进行序列化后在反序列化[/color]

2、使用代理模式来进行延迟加载
如果一个类加载的时候需要消耗大量的时间,我们可以对其进行延迟加载。用代理模式就可轻松完成。


public interface DBQuery {
String request();
}




public class DBQureyImpl implements DBQuery {

public DBQureyImpl() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

@Override
public String request() {
return "string";
}

}


sleep(1000)代表大量耗时等



public class DBProxy implements DBQuery {
private DBQuery instance;

@Override
public String request() {
if (instance == null) {
instance = new DBQureyImpl();
}
return instance.request();
}

}


这样就可以轻松实现,实际操作中我们可以使用动态代理等,当然也可以使用第三方的cglib与javassist,性能上来说cglib无论从生成代理类,还是调用动态方法都占优建议使用。
最后说一句hibernate的延迟加载就是通过cglib来实现的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值