一、饿汉式
/*饿汉式*/
class SingleTon{
private SingleTon single=new Single();
public SingleTon getInstance(){
return s;
}
}
饿汉式的是共同对象,但是因为没有多次运算。所以不会多线程时,不会产生数据出错。
二、懒汉式
class SingleTon{
private SingleTon single=null;
public SingleTon getInstance(){
if(single==null){
single=new SingleTon();
}
return s;
}
}
懒汉式的是共同对象,但是有多次运算,在多线程时,会产生数据出错。所以要用同步。
class SingleTon{
private SingleTon single=null;
public synchronized SingleTon getInstance(){
if(single==null){
single=new SingleTon();
}
return single;
}
}
可以解决问题,但是因为synchronized修饰方法的话,每次需要获取对象,都要争夺锁。导致资源浪费,性能降低。
那么加一句判断即可。
class SingleTon{
private SingleTon single=null;
public SingleTon getInstance(){
/*这个if无论有没有加上同步,都要进行判断的。*/
if(single==null){
/*如果null那么就创建实例。之后接下来的只要判断是不是null,只要不是统统就不用再进入同步锁*/
synchronized(single){
if(single==null){
single=new Single();
}
}
}
return single;
}
}
虽说提高性能。但是繁琐,容易出错。实际开发中,使用饿汉式。因为只要用到了单例,都要创建对象。那么直接使用饿汉式,不仅不会出现问题,而且代码相对于简化。