单例模式:饿汉式
private static Company company = new Company();
private Company() {}
public static Company getCompany() { return company; }
饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成,
单例模式:懒汉式
private static Company company;
private Company(){}
public static Company getInstance(){
if(company==null){
synchronized(Company.class){
if(company==null){
com=new Company();
}
}
}
return company;
}
在getInstance中做了两次null检查,确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,同时避免了每次都同步的性能损耗
单例模式:静态内部类
private Company(){}
private static Company getInstance(){
return Inner.com;
}
public static class Inner{
private static Company com=new Company();
}
利用了classloader的机制来保证初始化instance时只有一个线程,所以也是线程安全的,同时没有性能损耗,所以一般我倾向于使用这一种。
private static Company company = new Company();
private Company() {}
public static Company getCompany() { return company; }
饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成,
单例模式:懒汉式
private static Company company;
private Company(){}
public static Company getInstance(){
if(company==null){
synchronized(Company.class){
if(company==null){
com=new Company();
}
}
}
return company;
}
在getInstance中做了两次null检查,确保了只有第一次调用单例的时候才会做同步,这样也是线程安全的,同时避免了每次都同步的性能损耗
单例模式:静态内部类
private Company(){}
private static Company getInstance(){
return Inner.com;
}
public static class Inner{
private static Company com=new Company();
}
利用了classloader的机制来保证初始化instance时只有一个线程,所以也是线程安全的,同时没有性能损耗,所以一般我倾向于使用这一种。